正如标题所示,我正在尝试使用具有SIMD内在数据类型的STL向量。我知道由于加载/存储的潜在开销,这不是一个好习惯,但我遇到了一个非常奇怪的错误。这是代码:
#include "immintrin.h"
#include <vector>
#include <stdio.h>
#define VL 8
int main () {
std::vector<__m256> vec_1(10);
std::vector<__m256> vec_2(10);
float * tmp_1 = new float[VL];
printf("vec_1[0]:\n");
_mm256_storeu_ps(tmp_1, vec_1[0]); // seems to go as expected
for (int i = 0; i < VL; ++i)
printf("%f ", tmp_1[i]);
printf("\n");
delete tmp_1;
float * tmp_2 = new float[VL];
printf("vec_2[0]:\n");
_mm256_storeu_ps(tmp_2, vec_2[0]); // segmentation fault
for (int i = 0; i < VL; ++i)
printf("%f ", tmp_2[i]);
printf("\n");
delete tmp_2;
return 0;
}
我使用g++ -O3 -g -std=c++11 -mavx2 test.cpp -o test
编译了它。 vec_1[0]
按预期打印(全为零),但在vec_2[0]
时会出现分段错误。我认为这是对齐问题,但我使用了_mm256_store_ps
而不是_mm256_storeu_ps
,而不需要对齐。
这是一个带有AVX2扩展的Intel Haswell架构。 GCC版本是4.8.5。
欢迎任何可能的线索。