C++ 使用SSE的矩阵乘法

C++ 使用SSE的矩阵乘法,c++,c,matrix,sse,simd,C++,C,Matrix,Sse,Simd,我试图得到一个使用SIMD乘以2矩阵的工作示例,因为我需要将算法的时间与“正常”时间进行比较。 这就是为什么我试着这么做 当我运行我的程序时。我需要至少扩展到500x500矩阵。 谢谢您在main中声明的数组每个都有4个元素,但是您的乘法代码每个都读取和写入16个元素。写入超过分配的空间(在i循环的第二次迭代中,元素4和更高版本)将阻塞堆栈,导致出现错误。在main中声明的数组每个都有4个元素,但乘法代码每个都读取和写入16元素。在i循环的第二次迭代中,写入超过分配的空间(元素4和更高版本)将破

我试图得到一个使用SIMD乘以2矩阵的工作示例,因为我需要将算法的时间与“正常”时间进行比较。 这就是为什么我试着这么做

当我运行我的程序时。我需要至少扩展到500x500矩阵。
谢谢

您在
main
中声明的数组每个都有4个元素,但是您的乘法代码每个都读取和写入16个元素。写入超过分配的空间(在
i
循环的第二次迭代中,元素4和更高版本)将阻塞堆栈,导致出现错误。

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

我想我在理解代码时遇到了问题,正确的输入应该是什么?@Lvargas 4x4矩阵将包含16个元素。例如,main中的浮点数组应该是
floatc[16]具有更多用于
A
B
的初始值设定项。或者,您可以使用
float C[4][4]
获取
C[row][col]
符号。@Lvargas,使用
float a[16]、float B[16]、float C[16]但是如果你必须问这个问题,那么现在就使用intrinsic还为时过早。从标准C代码开始。谢谢!你知道唯一的方法就是创建更多的向量吗?如果我想乘以100x100,我如何缩放它们?@Lvargas这不是一个微不足道的变化。4x4代码具有若干优化功能,包括循环展开。如果要使用100x100或500x500矩阵,最好使用现有的矩阵库,这样可以有效地处理这些大尺寸的矩阵。我想我在理解代码时遇到了问题,正确的输入应该是什么?@Lvargas 4x4矩阵将包含16个元素。例如,main中的浮点数组应该是
floatc[16]具有更多用于
A
B
的初始值设定项。或者,您可以使用
float C[4][4]
获取
C[row][col]
符号。@Lvargas,使用
float a[16]、float B[16]、float C[16]但是如果你必须问这个问题,那么现在就使用intrinsic还为时过早。从标准C代码开始。谢谢!你知道唯一的方法就是创建更多的向量吗?如果我想乘以100x100,我如何缩放它们?@Lvargas这不是一个微不足道的变化。4x4代码具有若干优化功能,包括循环展开。如果您打算使用100x100或500x500矩阵,那么最好使用现有的矩阵库,该库将能够有效地处理这些大尺寸的矩阵。
#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);

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