繁体   English   中英

使用SSE进行矩阵乘法

[英]Matrix Multiplication Using SSE

我试图得到一个使用SIMD乘以2矩阵的工作示例,因为我需要将算法的时间与“正常”的时间进行比较。 这就是为什么我尝试进行高效4x4矩阵乘法(C与汇编)的原因

#include <xmmintrin.h>
#include <stdio.h>


void M4x4_SSE(float *A, float *B, float *C) {
    __m128 row1 = _mm_load_ps(&B[0]);
    __m128 row2 = _mm_load_ps(&B[4]);
    __m128 row3 = _mm_load_ps(&B[8]);
    __m128 row4 = _mm_load_ps(&B[12]);
    for(int i=0; i<4; i++) {
        __m128 brod1 = _mm_set1_ps(A[4*i + 0]);
        __m128 brod2 = _mm_set1_ps(A[4*i + 1]);
        __m128 brod3 = _mm_set1_ps(A[4*i + 2]);
        __m128 brod4 = _mm_set1_ps(A[4*i + 3]);
        __m128 row = _mm_add_ps(
                    _mm_add_ps(
                        _mm_mul_ps(brod1, row1),
                        _mm_mul_ps(brod2, row2)),
                    _mm_add_ps(
                        _mm_mul_ps(brod3, row3),
                        _mm_mul_ps(brod4, row4)));
        _mm_store_ps(&C[4*i], row);
    }
}


int main(){

  float A[4] __attribute__((aligned(16))) = {1,2,3,4};
  float B[4] __attribute__((aligned(16))) = {5,6,7,8};
  float C[4] __attribute__((aligned(16)));

  M4x4_SSE(A,B,C);

}

我不熟悉c或c ++,所以很难,我得到了:

*** stack smashing detected ***: ./prueba terminated
Aborted (core dumped)

当我运行程序时。 我至少需要缩放到500x500矩阵。 谢谢

您在main声明的数组每个都有4个元素,但是您的乘法代码每个读写16个元素。 超过分配的空间(元素4和更高版本,在i循环的第二次迭代中)进行写操作将破坏堆栈,从而导致您看到错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM