我试图通过替换我的应用程序摆脱未对齐的加载和存储为我的应用程序的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);
你们看到我错过了什么吗?
感谢所有的帮助到目前为止:)