创建 avx 向量的向量时出现段错误
Segfault while creating a vector of avx vectors
对于我当前的项目,我需要创建一个 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 和我正在使用的功能,请查看 intel intrinsic 网站 (https://software.intel.com/sites/landingpage/IntrinsicsGuide/)
AVX 需要对齐的数据。 vector
不保证元素会正确对齐。有关分配对齐的讨论,请参阅此问题 (How is a vector's data aligned?),特别是关于 SIMD 执行。
使用 C++17,std::vector 保证元素正确对齐。
How is a vector's data aligned?
对于我当前的项目,我需要创建一个 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 和我正在使用的功能,请查看 intel intrinsic 网站 (https://software.intel.com/sites/landingpage/IntrinsicsGuide/)
AVX 需要对齐的数据。 vector
不保证元素会正确对齐。有关分配对齐的讨论,请参阅此问题 (How is a vector's data aligned?),特别是关于 SIMD 执行。
使用 C++17,std::vector 保证元素正确对齐。
How is a vector's data aligned?