c - 使用基本 SSE 指令的段错误

标签 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));

我要赛格了。此行的错误:__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] 

最佳答案

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

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

关于c - 使用基本 SSE 指令的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46945328/

相关文章:

c - 程序在运行时在提供输入时崩溃

c++ - 用 GDB nexti 解释段错误的原因

java - Java strictfp 修饰符对现代 CPU 有什么影响吗?

c - 如何对 __m128 类型变量中的浮点元素求反(更改符号)?

c - 缓冲区溢出解释

c - 在平衡搜索树中插入元素

C输入输出重定向错误?

c++ - float4::set_wxy(和其他 set-swizzle 操作)的更好 SSE2 实现?

c - 如何将一个整数分成多个数字?

c - 微基准测试显示进程切换比线程切换更快;怎么了?