我试图通过替换
来摆脱我的应用程序的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);
你们有没有看到我失踪的东西? 感谢目前为止的所有帮助:)
答案 0 :(得分:4)
变化:
printf("%p\n", &ptr)
为:
printf("%p\n", ptr)
ptr指向的内存需要16字节对齐,而不是实际的指针变量本身。