【发布时间】: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 上运行。你认为对齐会是个问题吗?