使用基本 SSE 指令的分段错误

Posted

技术标签:

【中文标题】使用基本 SSE 指令的分段错误【英文标题】:Segmentation fault using basic SSE instructions 【发布时间】:2017-10-26 03:18:01 【问题描述】:

我刚开始使用 SSE 指令: 程序将两个矩阵读入一个连续的缓冲区,然后尝试从那里对它们进行操作,代码如下:

void multMatrix(void * buffer,int n)
    int i,j;
    float *p = (float*) buffer;
    float *q = (float*) buffer + (n*n);
    float mr[n][n];

    __m128 va = _mm_load_ps(&p[0]);
    __m128 vb = _mm_load_ps(&q[0]);
    __m128 mm_r = _mm_add_ps( va, vb );
    _mm_store_ps (mr[0],mm_r);

    return;

缓冲区定义为:

void * buffer = malloc(sizeof(float)*n*n*2 + sizeof(float));

我得到段。这条线的故障:__m128 mm_r = _mm_add_ps( va, vb );

但是如果我评论_mm_store_ps (mr[0],mm_r);它会正常退出。

我只是在测试和学习 SSE 指令,但我对这个程序的目标是:

A[n][n] * B[n][n] = C[n][n] 

【问题讨论】:

SSE 数组需要在特定边界上对齐。 malloc 可能没有使用正确的对齐方式。也没有定义数组。您需要使用特定于平台或编译器的函数以适当的对齐方式进行分配。 【参考方案1】:

首先尝试使用未对齐的加载和存储:loadu、storeu。然后使缓冲区/指针对齐到 16 字节边界。

此外,指针 q 访问的矩阵超出范围——当最后一条存储指令被注释掉时,编译器可能足够聪明,不会产生任何这些指令。

【讨论】:

感谢您的快速回复。我设法通过将所有 malloc 更改为 _mm_mallocs 将所有数组对齐到 16 个字节来使其工作。我在理解对齐的概念时遇到了一些困难,但现在一切都清楚了。

以上是关于使用基本 SSE 指令的分段错误的主要内容,如果未能解决你的问题,请参考以下文章

SSE _mm_store_ps 分段错误问题

SSE指令需要数据对齐

SSE _mm_load_ps 导致分段错误

使用结果浮点数时的 SSE SIMD 分段错误

Intel SSE Intrinsics _mm_load_si128 分段错误,

mov指令中的分段错误