C语言中的英特尔AVX乘法错误,

C语言中的英特尔AVX乘法错误,,c,segmentation-fault,avx,C,Segmentation Fault,Avx,当我运行一个简单的加载序列时,使用AVX内部函数进行减法和乘法,我经常会得到以下错误: Process terminating with default action of signal 11 (SIGSEGV) ==2995== General Protection Fault 从C代码中 double res[4] = {0.0, 0.0, 0.0, 0.0}; for(int i = 0; i < 10; i++){ ymm0 = _mm256_load

当我运行一个简单的加载序列时,使用AVX内部函数进行减法和乘法,我经常会得到以下错误:

 Process terminating with default action of signal 11 (SIGSEGV)
==2995==  General Protection Fault
从C代码中

double res[4] = {0.0, 0.0, 0.0, 0.0};
for(int i = 0; i < 10; i++){
            ymm0 = _mm256_loadu_pd(vector_a);
            ymm1 = _mm256_loadu_pd(vector_b);
            ymm2 = _mm256_sub_pd(ymm0, ymm1);
            ymm4 = _mm256_mul_pd(ymm2, ymm2);  <--- Valgrind terminated
            _mm256_store_pd((double*)res, ymm4);
}

使用
\u mm256\u storeu\u pd
。就像您的加载一样,需要一个未对齐的存储,因为不能保证数组对AVX正确对齐。

它在存储上崩溃,而不是乘法。检查
res
是否指向内存中的有效位置。double res[4]={0.0,0.0,0.0,0.0};你在使用什么编译器?x86 64位上的Clang3.4…它修复了它!但是..如何对齐阵列?它是否必须像256bit对齐或使用posix memalign或类似的东西?posix memalign是我使用的。@lukieleetronic如果只是为了操作的输出,那么对齐阵列可能不值得。但是您需要使用memalign之类的东西,或者使用_属性_((aligned(32))静态分配。后者不适用于非静态局部变量。
double vector_a[4] = {0.145000, 1.145000, 2.145000, 3.145000};
double vector_b[4] = {0.145000, 1.145000, 2.145000, 3.145000};