使用 SSE 的矩阵乘法
Matrix Multiplication Using SSE
我试图获得一个使用 SIMD 乘以 2 矩阵的工作示例,因为我需要将算法的时间与 "normal" 进行比较。
这就是我尝试做 Efficient 4x4 matrix multiplication (C vs assembly) .
的原因
#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 个元素。写入分配的 space(元素 4 及更高版本,在 i
循环的第二次迭代中)将破坏堆栈,导致您看到错误。
我试图获得一个使用 SIMD 乘以 2 矩阵的工作示例,因为我需要将算法的时间与 "normal" 进行比较。 这就是我尝试做 Efficient 4x4 matrix multiplication (C vs assembly) .
的原因#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 个元素。写入分配的 space(元素 4 及更高版本,在 i
循环的第二次迭代中)将破坏堆栈,导致您看到错误。