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

我正试图在一段代码上实现SSE矢量化,为此我需要我的一维数组为16字节内存对齐。 但是,我尝试了几种方法来分配16byte内存对齐的数据,但最终却是4byte内存对齐。

我必须与英特尔icc编译器一起工作。 这是我正在测试的示例代码:

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

  void error(char *str)
  {
   printf("Error:%sn",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] = %pn",i,&A[i]);

        free(A);

         return 0;
   }

这是我得到的输出:

 &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

它每次4byte对齐,我已经使用memalign,posix memalign。 由于我在Linux上工作,我不能使用_mm_malloc,我也不能使用_aligned_malloc。 当我尝试使用_aligned_attribute(我认为它适用于单独的gcc)时,出现内存损坏错误。

任何人都可以帮助我准确地为linux平台上的icc生成16byte内存对齐数据。


你分配的内存是16字节对齐的。 看到:
&A[0] = 0x11fe010
但是在一个float数组中,每个元素都是4个字节,所以第二个元素是4字节对齐的。

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

struct x {
    float y;
} __attribute__((aligned(16)));
struct x *A = memalign(...);

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


AFAIK, memalignposix_memalign都在做他们的工作。

&A[0] = 0x11fe010

这是对齐到16个字节。

&A[1] = 0x11fe014

当你执行&A[1]你正在告诉压缩机向float指针添加一个位置。 这将不可避免地导致:

&A[0] + sizeof( float ) = 0x11fe010 + 4 = 0x11fe014

如果您打算让矢量中的每个元素都对齐到16个字节,则应考虑声明16个字节宽的结构数组。

struct float_16byte
{
    float data;
    float padding[ 3 ];
}
    A[ ELEMENT_COUNT ];

然后你必须为ELEMENT_COUNT (在你的例子中为20)变量分配内存:

struct float_16byte *A = ( struct float_16byte * )memalign( 16, ELEMENT_COUNT * sizeof( struct float_16byte ) );
链接地址: http://www.djcxy.com/p/72729.html

上一篇: How to allocate 16byte memory aligned data

下一篇: How to probe a computer if it supports SSE2 in Delphi 32?