Linux上的AVX分段错误[关闭]

Posted

技术标签:

【中文标题】Linux上的AVX分段错误[关闭]【英文标题】:AVX segmentation fault on linux [closed] 【发布时间】: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 上运行。你认为对齐会是个问题吗? 【参考方案1】:

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

【讨论】:

谢谢你成功了!谢谢@RyanP 的替代答案! :)

以上是关于Linux上的AVX分段错误[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

cygwin 上的 AVX 加载指令失败

push_back 上的分段错误[关闭]

为啥在编译我的代码C(linux)时出现分段错误(核心转储)[关闭]

linux (g++) 上的分段错误,但 Mac OS 上没有。?

在Linux机器上运行C代码时出现分段错误(核心转储)[关闭]

C++ 服务器 Linux 机器上的分段错误 - 适用于 Mac