【问题标题】:AVX segmentation fault on linux [closed]Linux上的AVX分段错误[关闭]
【发布时间】:2015-10-27 16:25:20
【问题描述】:

我正在尝试运行此代码,但运行时显示分段错误。它编译得很好。这是代码。 (它在 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;
}

编译:g++ -mavx t2.cpp -o t2

它在遇到第一条 AVX 指令时退出。 我只是希望有人检查我的代码。

这里是 gdb 回溯

(gdb) run
Program received signal SIGSEGV, Segmentation fault.
0x0000000000400aea in bar(int) ()
Missing separate debuginfos, use: debuginfo-install glibc-2.17-78.el7.x86_64 libgcc-4.8.3-9.el7.x86_64 libstdc++-4.8.3-9.el7.x86_64
(gdb) bt
#0  0x0000000000400aea in bar(int) ()
#1  0x0000000000400b95 in main ()
(gdb)

【问题讨论】:

  • “编译好”并不意味着“是一个可用的程序”。您需要解释此代码在何处崩溃。我们不会试图猜测问题出在哪里。
  • 当然。碰到第一条 AVX 指令就崩溃了
  • 对于初学者来说,当 i 不是您的循环变量时,您似乎在引用 &amp;A[0] + i*8。另外,我会确保loop 可以被 8 整除,并在循环增量时执行j+=8,并将地址设置为A[j]。此外,您的向量可能没有正确对齐,您应该检查 A[0] 是否按照 AVX 的要求对齐。出于性能原因,大多数现代编译器都会对齐内存,但我不知道有什么保证。这就是为什么很多 SSE/AVX 代码使用诸如 _aligned_malloc 之类的东西的原因
  • 即使移除了循环。它显示相同。我相应地编辑了我的问题。
  • @RyanP:但它可以在 Windows 上运行。你认为对齐会是个问题吗?

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


【解决方案1】:

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

【讨论】:

  • 谢谢你成功了!谢谢@RyanP 的替代答案! :)
猜你喜欢
  • 1970-01-01
  • 2021-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-23
  • 1970-01-01
  • 2012-05-14
  • 2020-11-30
相关资源
最近更新 更多