如何分配16byte内存对齐数据

PGO*_*eGo 12 c memory sse icc

我试图在一段代码上实现SSE向量化,我需要将我的1D数组与16字节内存对齐.但是,我已经尝试了几种方法来分配16字节内存对齐数据,但它最终是4字节内存对齐.

我必须使用Intel icc编译器.这是我正在测试的示例代码:

  #include <stdio.h>
  #include <stdlib.h>

  void error(char *str)
  {
   printf("Error:%s\n",str);
   exit(-1);
  }

  int main()
  {
   int i;
   //float *A=NULL;
   float *A = (float*) memalign(16,20*sizeof(float));

   //align
   // if (posix_memalign((void **)&A, 16, 20*sizeof(void*)) != 0)
   //   error("Cannot align");

    for(i = 0; i < 20; i++)
       printf("&A[%d] = %p\n",i,&A[i]);

        free(A);

         return 0;
   }
Run Code Online (Sandbox Code Playgroud)

这是我得到的输出:

 &A[0] = 0x11fe010
 &A[1] = 0x11fe014
 &A[2] = 0x11fe018
 &A[3] = 0x11fe01c
 &A[4] = 0x11fe020
 &A[5] = 0x11fe024
 &A[6] = 0x11fe028
 &A[7] = 0x11fe02c
 &A[8] = 0x11fe030
 &A[9] = 0x11fe034
 &A[10] = 0x11fe038
 &A[11] = 0x11fe03c
 &A[12] = 0x11fe040
 &A[13] = 0x11fe044
 &A[14] = 0x11fe048
 &A[15] = 0x11fe04c
 &A[16] = 0x11fe050
 &A[17] = 0x11fe054
 &A[18] = 0x11fe058
 &A[19] = 0x11fe05c
Run Code Online (Sandbox Code Playgroud)

它每次都是4字节对齐,我使用了memalign,posix memalign.由于我在Linux上工作,我不能使用_mm_malloc也不能使用_aligned_malloc.当我尝试使用_aligned_attribute(我认为它仅适用于gcc)时,我收到内存损坏错误.

任何人都可以协助我在linux平台上为icc准确生成16byte内存对齐数据.

ugo*_*ren 15

您分配的内存是16字节对齐的.请参阅:
&A[0] = 0x11fe010
但在一个数组中float,每个元素是4个字节,因此第二个是4字节对齐.

您可以使用一个结构数组,每个结构包含一个浮点数,其aligned属性为:

struct x {
    float y;
} __attribute__((aligned(16)));
struct x *A = memalign(...);
Run Code Online (Sandbox Code Playgroud)


小智 7

memalign函数返回的地址是0x11fe010,它的倍数0x10.所以功能正在做正确的事情.这也意味着,你的阵列正确的一个16字节边界上对齐.您以后要做的是打印float阵列中每个下一个类型元素的地址.由于float在您的情况下大小恰好是4个字节,因此每个下一个地址将等于前一个地址+4.例如,0x11fe010 + 0x4 = 0x11FE014.当然,地址0x11FE014不是倍数0x10.如果要在16字节边界上对齐所有浮点数,则必须浪费16 / 4 - 1每个元素的字节数.仔细检查您正在使用的内在函数的要求.