Segfault同时创建avx向量的向量

时间:2015-06-04 01:12:05

标签: c++ vector segmentation-fault intrinsics avx

对于我当前的项目,我需要创建一个256位AVX向量的向量。我用了

myVector = vector<__m256d>(nrVars(), _mm256_set1_pd(1.0));

一次工作正常,但在执行两次后,它给了我一个分段错误。我能够提出以下代码

vector<__m256d> temp;
__m256d entry = _mm256_set1_pd(1.0);
temp = vector<__m256d>(10, entry);
temp = vector<__m256d>(10, entry);

总是会产生分段错误。你能解释一下为什么会这样,以及我将来如何避免这个问题?

非常感谢!

P.S。即使这样也行不通:

myVector.clear();
myVector.reserve(nrVars());
for (size_t i=0; i<nrVars(); ++i) {
    myVector[i] = _mm256_set1_pd(1.0);
}

并回答评论。这是一个产生段错误的完整示例:

#include <vector>
#include "immintrin.h"

using namespace std;
int main(int argc, char **argv) {
    vector<__m256d> temp;
    __m256d entry = _mm256_set1_pd(1.0);
    temp = vector<__m256d>(10, entry);
    temp = vector<__m256d>(10, entry);
    return 0;
}

要阅读m256d以及我正在使用的功能,请查看英特尔内部网站(https://software.intel.com/sites/landingpage/IntrinsicsGuide/

2 个答案:

答案 0 :(得分:3)

AVX需要对齐数据。 vector不保证元素将正确对齐。有关分配对齐的讨论,请参阅此问题(How is a vector's data aligned?),特别是有关SIMD执行的讨论。

答案 1 :(得分:0)

在 C++17 中,std::vector 保证元素正确对齐。

How is a vector's data aligned?