使用基本SSE指令进行分段故障

时间:2017-10-26 03:18:01

标签: c segmentation-fault sse intrinsics

我刚开始使用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));

我正在接受seg。这一行的错误:__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] 

1 个答案:

答案 0 :(得分:0)

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

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