AVX2 SIMD 添加不起作用
AVX2 SIMD addition not working
我正在尝试使用 AVX2 SIMD 指令添加这两个向量。
代码编译时没有错误和警告,但在 运行 时崩溃。为什么?
无论在main方法中初始化的数组有多大,它都应该用AVX2打印SIMD加法的结果。
#include <iostream>
#include <immintrin.h>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
void mul(float *a, float *b, float *c, int ARR_SIZE){
for (int i=0; i < ARR_SIZE ; i+=8){
__m256 vecA = _mm256_load_ps(&a[i]);
__m256 vecB = _mm256_load_ps(&b[i]);
__m256 res = _mm256_add_ps(vecA,vecB);
_mm256_store_ps(&c[i],res);
float* f = (float*)&c[i];
printf("%f %f %f %f %f %f %f %f\n", f[i + 0], f[i + 1], f[i + 2], f[i + 3], f[i + 4], f[i + 5], f[i + 6], f[i + 7]);
}
}
int main(){
float a[] = {1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0};
float b[] = {1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0};
int arrsize = sizeof(a) / sizeof (a[0]);
float c[arrsize];
mul((float*)&a, (float*)&b , (float*)&c, arrsize);
return 0;
}
在尝试了未对齐的加载和存储之后,程序完美运行。
我正在尝试使用 AVX2 SIMD 指令添加这两个向量。
代码编译时没有错误和警告,但在 运行 时崩溃。为什么?
无论在main方法中初始化的数组有多大,它都应该用AVX2打印SIMD加法的结果。
#include <iostream>
#include <immintrin.h>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
void mul(float *a, float *b, float *c, int ARR_SIZE){
for (int i=0; i < ARR_SIZE ; i+=8){
__m256 vecA = _mm256_load_ps(&a[i]);
__m256 vecB = _mm256_load_ps(&b[i]);
__m256 res = _mm256_add_ps(vecA,vecB);
_mm256_store_ps(&c[i],res);
float* f = (float*)&c[i];
printf("%f %f %f %f %f %f %f %f\n", f[i + 0], f[i + 1], f[i + 2], f[i + 3], f[i + 4], f[i + 5], f[i + 6], f[i + 7]);
}
}
int main(){
float a[] = {1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0};
float b[] = {1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0};
int arrsize = sizeof(a) / sizeof (a[0]);
float c[arrsize];
mul((float*)&a, (float*)&b , (float*)&c, arrsize);
return 0;
}
在尝试了未对齐的加载和存储之后,程序完美运行。