【发布时间】:2012-06-18 13:59:59
【问题描述】:
我正在尝试在一段代码上实现 SSE 矢量化,我需要我的一维数组与 16 字节内存对齐。但是,我尝试了几种方法来分配 16 字节内存对齐的数据,但它最终是 4 字节内存对齐的。
我必须使用英特尔 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;
}
这是我得到的输出:
&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
它每次都是 4 字节对齐的,我用过 memalign,posix memalign。由于我在 Linux 上工作,我不能使用 _mm_malloc 也不能使用 _aligned_malloc。 当我尝试使用 _aligned_attribute 时出现内存损坏错误(我认为仅适用于 gcc)。
谁能帮我在linux平台上为icc准确生成16字节内存对齐数据。
【问题讨论】:
-
你怎么知道它是 4 字节对齐的,仅仅因为 printf 一次只输出 4 个字节?正因为您使用的是 memalign 例程,所以您将其放入浮点类型。当您使用 printf 打印时,它知道如何处理它的原始类型(浮点数)。
-
为什么不能在 Linux 上使用“_mm_malloc”?