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

4

我正在尝试通过替换移植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
我非常确定这是变量h和w,但需要它是16的倍数吗? - Ricky
当然可以。这会加载4个浮点数。因此,您必须至少有4个可用的浮点数。 - Christopher
然后您需要发布崩溃代码。 - Christopher
尝试过了,但是出现了“错误:类型为‘float’的参数与类型为‘const float *’的参数不兼容”的错误。 - Ricky
显示剩余5条评论
1个回答

4

改变:

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

to:

printf("%p\n", ptr)

需要对ptr指向的内存进行16字节对齐,而不是指针本身。


谢谢,这解决了问题的一部分,所以数据在内存中正确地对齐为16字节。但是当我尝试对此数据进行对齐的加载/存储时,仍然会出现分段错误。这有什么常见的原因吗? - Ricky
1
当你遇到段错误时,你应该进入调试器并查看是哪条指令导致了它以及地址是什么 - 这应该告诉你所有需要知道的来修复问题,例如未对齐的地址、无效的地址(越界或空值)等。 - Paul R

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接