使用SSE指令进行16字节存储器对齐

时间:2011-12-13 10:51:05

标签: intel sse memory-alignment

我试图通过替换

来摆脱我的应用程序的SSE指令的未对齐加载和存储
_mm_loadu_ps()

通过

_mm_load_ps()

并使用以下内容分配内存:

float *ptr = (float *) _mm_malloc(h*w*sizeof(float),16)

而不是:

float *ptr = (float *) malloc(h*w*sizeof(float))

然而,我使用以下方法打印指针地址:

printf("%p\n", &ptr)

我得到输出:

0x2521d20
0x2521d28
0x2521d30
0x2521d38
0x2521d40
0x2521d48
...

这不是16字节对齐,即使我使用_mm_malloc函数? 当对SSE指令使用对齐的加载/存储操作时,我会产生分段错误,因为数据不是16字节对齐的。

任何想法为什么没有正确对齐或任何其他想法来解决这个问题?

提前致谢!


更新

使用

printf("%p\n",ptr)

解决了内存对齐问题,数据确实正确对齐。

然而,当我尝试对这些数据进行对齐加载/存储时,我仍然会遇到分段错误,我怀疑这是一个指针问题。

分配内存时:

contents* instance;
instance.values = (float *) _mm_malloc(h*w*sizeof(float),16);    

我有一个结构:

typedef struct{
  ...
  float** values;
  ...
}contents;

在代码中,然后在另一个函数中执行,指向作为参数传递的内容:

__m128 tmp = _mm_load_ps(&contents.values);

你们有没有看到我失踪的东西? 感谢目前为止的所有帮助:)

1 个答案:

答案 0 :(得分:4)

变化:

printf("%p\n", &ptr)

为:

printf("%p\n", ptr)

ptr指向的内存需要16字节对齐,而不是实际的指针变量本身。