我正在尝试通过替换移植SSE指令的不对齐加载和存储来优化我的应用程序。
_mm_loadu_ps()
by
_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
...
即使我使用了_mm_malloc函数,这个数据仍然没有16字节对齐。
当使用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);
你们有没有发现我漏掉了什么?感谢你们迄今为止提供的所有帮助 :)
h * w * sizeof(float)
是16的倍数吗? - Christopher