老实说,这是我第一次使用任何类型的库,例如 Yeppp!,我的意思是 SIMD 库具有动态运行时选择,或者他们会用它来表达。最终结果是该库应该选择最佳的 SIMD 汇编代码以在其运行的任何平台和硬件上运行。
这似乎是在我的项目中使用的一个很好的工具,但是,正如标题所述,我不能调用任何 Yeppp!功能没有发生分段错误。我能够获得的调试信息也没有真正的帮助。
我的系统配置是:
Xubuntu 13.04 'raring' with Linux 3.8.0-31-generic x86_64
GCC 4.8.1 --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu .... etc, there were many more, but I chose the important ones
Code::Blocks IDE and GDB 7.5.91.20130417-cvs-ubuntu debugger through Code::Blocks
Intel Pentium(R) Dual-Core CPU T4400 @ 2.20GHz with SIMD instruction sets MMX, SSE, SSE2, SSSE3
我列出了CPU之类的,因为它可能对Yeppp很重要!选择正确的运行时,这可能是问题所在。
下面是我正在使用的简单测试代码,虽然我尝试了其他 Yeppp!具有各种数据类型的函数,都是相同的分段错误。我也尝试过各种对齐方式,如 32 和 64,但我怀疑这是问题所在。
YEP_ALIGN(16) int32_t a[100], b[100], c[100];
//just test values
for( int x = 0; x < 100; x++ ) {
a[x] = x + 1;
b[x] = x - 1;
}
yepCore_Add_V32sV32s_V32s( a, b, c, 100 );
我没有使用任何特殊标志或任何东西来编译它,所以没有 -m32 或 64。我也在 C 中尝试过同样的事情,结果相同,程序集基本相同,所以它不是语言。
我链接到 Yeppp 提供的 Linux x86_64 libyeppp.so 二进制文件!发行版,因为我运行的是 64 位平台,它是 GCC 甚至接受的唯一一个。
调用反汇编为:
0x40179a lea rdx,[rbp-0x1a0]
0x4017a1 lea rsi,[rbp-0x330]
0x4017a8 lea rax,[rbp-0x4c0]
0x4017af mov ecx,0x64
0x4017b4 mov rdi,rax
0x4017b7 call 0x401550 <yepCore_Add_V32sV32s_V32s@plt>
这看起来很标准。但是,当进入该功能时,我得到:
0x401550 jmp QWORD PTR [rip+0x205b7a] # 0x6070d0 <yepCore_Add_V32sV32s_V32s@got.plt>
0x401556 push 0x17
0x40155b jmp 0x4013d0
0x401550 jmp QWORD PTR [rip+0x205b7a] # 0x6070d0 <yepCore_Add_V32sV32s_V32s@got.plt>
0x401556 push 0x17
0x40155b jmp 0x4013d0
jmp 0x4013d0
然后,在执行 GDB 后向我发送一些指令
0 No function contains specified address.
然后下一条指令,假设有一个并且它没有尝试以 NULL 运行,导致分段错误。这大约是我所能得到的。经过几次调整后,它会尝试打开一个../sysdeps/x86_64/dl-trampoline.S
找不到的文件。
我几乎处于死胡同,为什么它会这样做,除非 Yeppp!本身就有缺陷。自从 Yeppp 1.0 发布以来!图书馆只有几天的历史,我找不到任何有类似问题或任何问题的人。
PS:这是我很长时间以来第一次公开询问有关编程的问题,所以如果需要任何进一步的信息来帮助解决这个问题,我会很乐意提供。