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 不是您的循环变量时,您似乎在引用&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分段错误[关闭]的主要内容,如果未能解决你的问题,请参考以下文章
为啥在编译我的代码C(linux)时出现分段错误(核心转储)[关闭]
linux (g++) 上的分段错误,但 Mac OS 上没有。?