Linux上的AVX分段故障

时间:2015-10-27 16:25:20

标签: c++ linux g++ simd avx

我正在尝试运行此代码,并且在运行时会显示分段错误。它编译好。这是代码。 (它适用于Windows)。

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

const int size = 1000000;

std::vector<float>A(size);
std::vector<float>B(size);
std::vector<float>C(size);

void bar(int i){
    const float a = 2.0f;
    __m256 _a = _mm256_broadcast_ss(&a);
    __m256 _A = _mm256_load_ps(&A[0] + i*8);
    __m256 _B = _mm256_load_ps(&B[0] + i*8);
    __m256 _C = _mm256_add_ps(_B, _mm256_mul_ps(_a,_A));
    _mm256_store_ps(&C[0] + i*8, _C);
}


int main(){
    std::fill(A.begin(), A.end(), 1.0f);
    std::fill(B.begin(), B.end(), 2.0f);
    bar(0);

    return 0;
}

编译:{{1​​}}

当它击中第一个AVX指令时退出。 我只是希望有人审查我的代码。

这是gdb back trace

g++ -mavx t2.cpp -o t2

1 个答案:

答案 0 :(得分:4)

这可能是一个数据对齐问题。 _mm256_load_ps需要256位(32字节)对齐的内存。 std :: vector的默认分配器不符合该要求。您需要提供对齐的分配器或使用具有不太严格的对齐要求的其他指令(例如_mm256_loadu_ps)。