C++ 创建avx向量向量时发生SEGFULT

C++ 创建avx向量向量时发生SEGFULT,c++,vector,segmentation-fault,intrinsics,avx,C++,Vector,Segmentation Fault,Intrinsics,Avx,对于我当前的项目,我需要创建一个256bit AVX向量。我曾经 myVector = vector<__m256d>(nrVars(), _mm256_set1_pd(1.0)); myVector=vector(nrVars(),_mm256_set1_pd(1.0)); 一次运行良好,但在执行两次该行之后,它给了我一个分段错误。我能想出下面的一段代码 vector<__m256d> temp; __m256d entry = _mm256_set1_pd(1.0

对于我当前的项目,我需要创建一个256bit AVX向量。我曾经

myVector = vector<__m256d>(nrVars(), _mm256_set1_pd(1.0));
myVector=vector(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);
矢量温度;
__m256d条目=_mm256_set1_pd(1.0);
温度=矢量(10,输入);
温度=矢量(10,输入);
这总是会产生分段错误。你能给我解释一下为什么会这样,以及我将来如何避免这个问题吗

多谢各位

注意:即使这样也不行:

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

对于(size_t i=0;iAVX需要对齐的数据。
vector
不能保证元素正确对齐。请参阅此问题()有关分配对齐的讨论,特别是有关SIMD执行的讨论。

AVX需要对齐的数据。
vector
不能保证元素正确对齐。请参阅此问题()对于分配对齐的讨论,特别是有关SIMD执行的讨论。

对于C++17,std::vector保证元素将正确对齐


使用C++17,std::vector可以保证元素正确对齐


信息不足。提供一个完整、最小、可重复、可编译的例子来演示问题,而不是随机选择代码的片段。用C++,一个bug会导致代码的一部分内存损坏,直到出现其他受影响的内存访问,才会触发Sebug。SE你在一个特定的地方,完全没有关于代码的特定部分。即使你发布了最少有用的信息,它看起来很可能是你的bug在其他地方。欢迎来到C++。你需要发布更多的信息:<代码>
。更具体地说,什么是
m256d
,函数
mm256set1pd
看起来像什么/做什么?mm256d是AVX中的标准类型,mm256set1pd是标准固有类型。他标记了问题AVX,不需要解释基本原理。如果你对某件事缺乏经验,不要责怪帖子信息不足。提供一个完整的、最小的、可重复的、可编译的示例来演示问题,而不是随机选择代码的片段。用C++,一个bug可能导致代码的一部分内存损坏,直到出现受影响的内存访问其他地方,才触发Sebug。你在一个特定的位置上进行了分段,完全不涉及代码的特定部分。即使你发布了最少的有用信息,它看起来很可能是你的bug在其他地方。欢迎来到C++。你需要在这方面发布更多信息:<代码>。更具体地说,什么是
m256d
,函数
mm256set1pd
看起来像什么/做什么?mm256d是AVX中的标准类型,mm256set1pd是标准固有类型。他标记了问题AVX,不需要解释基本原理。如果你对某件事缺乏经验,不要责怪帖子呃,谢谢,虽然这看起来很难实现……但我会在我的机器上运行后立即接受你的答案。VX实际上不需要对齐的数据,除非编译器生成
vmovaps
而不是
vmovups
。AVX非移动指令的内存操作数不需要对齐。只有不需要对齐加载和存储移动指令的对齐版本会出错。在某些方面,编译器会使未对齐的数据成为错误,从而使您免于性能稍慢的问题,这是很好的。谢谢,尽管这看起来实施起来会很痛苦……我会在mach上运行后立即接受您的答案ineAVX实际上不需要对齐的数据,除非编译器生成
vmovaps
而不是
vmovups
。AVX非移动指令的内存操作数不必对齐。只有对齐版本的加载和存储移动指令才会出错。在某些方面,编译器可以将您从错误中解救出来但是,如果将未对齐的数据设置为错误,会降低数据的性能。杜德,5年前,一个公认的答案说的完全相同。你是机器人吗?@user667804我不是机器人,我错了,对不起:/杜德,5年前,一个公认的答案说的完全相同。你是机器人吗?@user667804我不是机器人,我错了,对不起:/
#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;
}