使用具有SIMD内部数据类型的STL向量

时间:2016-09-21 05:26:44

标签: c++11 segmentation-fault stdvector simd intrinsics

正如标题所示,我正在尝试使用具有SIMD内在数据类型的STL向量。我知道由于加载/存储的潜在开销,这不是一个好习惯,但我遇到了一个非常奇怪的错误。这是代码:

#include "immintrin.h"
#include <vector>
#include <stdio.h>

#define VL 8

int main () {
    std::vector<__m256> vec_1(10);
    std::vector<__m256> vec_2(10);

    float * tmp_1 = new float[VL];
    printf("vec_1[0]:\n");
    _mm256_storeu_ps(tmp_1, vec_1[0]); // seems to go as expected
    for (int i = 0; i < VL; ++i)
        printf("%f ", tmp_1[i]);
    printf("\n");
    delete tmp_1;

    float * tmp_2 = new float[VL];
    printf("vec_2[0]:\n");
    _mm256_storeu_ps(tmp_2, vec_2[0]); // segmentation fault
    for (int i = 0; i < VL; ++i)
        printf("%f ", tmp_2[i]);
    printf("\n");
    delete tmp_2;

    return 0;
}

我使用g++ -O3 -g -std=c++11 -mavx2 test.cpp -o test编译了它。 vec_1[0]按预期打印(全为零),但在vec_2[0]时会出现分段错误。我认为这是对齐问题,但我使用了_mm256_store_ps而不是_mm256_storeu_ps,而不需要对齐。

这是一个带有AVX2扩展的Intel Haswell架构。 GCC版本是4.8.5。

欢迎任何可能的线索。

0 个答案:

没有答案