【发布时间】:2015-06-04 01:12:05
【问题描述】:
对于我当前的项目,我需要创建一个 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);
总是会产生分段错误。您能否向我解释一下为什么会出现这种情况以及我以后如何避免这个问题?
非常感谢!
附:即使这样也行不通:
myVector.clear();
myVector.reserve(nrVars());
for (size_t i=0; i<nrVars(); ++i) {
myVector[i] = _mm256_set1_pd(1.0);
}
并回答 cmets。这是一个产生段错误的完整示例:
#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/)
【问题讨论】:
-
信息不足。提供一个完整的、最小的、可重现的、可编译的示例来演示问题,而不是随机选择代码的 sn-ps。使用 C++,错误可能会导致代码的一部分出现内存损坏,直到在其他地方访问受影响的内存时才会出现,从而触发段错误。仅仅因为您在特定位置出现段错误,就绝对没有说明代码的特定部分。尽管您发布的有用信息很少,但您的错误很可能在其他地方。欢迎使用 C++。
-
您需要发布更多关于此的信息:
__m256d entry = _mm256_set1_pd(1.0);.. 更具体地说,__m256d是什么,_mm256_set1_pd的功能是什么? /跨度> -
__mm256d 是 AVX 中的标准类型,_mm256_set1_pd 是标准内在类型。他标记了问题 AVX,并且不需要解释基本面。如果您对某事没有经验,请不要责怪发帖者。
标签: c++ vector segmentation-fault intrinsics avx