如何分配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, memalign
和posix_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?