任何Yeppp上的分段错误!api电话

nov*_*azy 3 c++ linux simd segmentation-fault yeppp

说实话,这是我第一次使用像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
Run Code Online (Sandbox Code Playgroud)

我列出了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 );
Run Code Online (Sandbox Code Playgroud)

我没有使用任何特殊标志或任何东西编译它,所以没有-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>
Run Code Online (Sandbox Code Playgroud)

这看起来很标准.但是,当我进入函数时,我得到:

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
Run Code Online (Sandbox Code Playgroud)

然后,jmp 0x4013d0在执行GDB给我之后,向前发几条指令

0   No function contains specified address.
Run Code Online (Sandbox Code Playgroud)

然后下一条指令,假设有一条并且它不会尝试以NULL运行,则会导致分段错误.这就是我能够得到的.经过几次调整后,它会尝试打开一个../sysdeps/x86_64/dl-trampoline.S找不到的文件.

除非是Yeppp,否则为什么会这样做我几乎是死路一条!本身就是错误的.自从Yeppp发布1.0以来!图书馆只有几天的历史,我找不到任何有类似问题或任何问题的人.

PS:这是我很久以来第一次公开询问关于编程的问题,所以如果需要任何进一步的信息来帮助解决这个问题,我很乐意提供它.

Mar*_*han 5

您需要yepLibrary_Init()在使用库之前调用(并yepLibrary_Release()在完成之后).此函数检测CPU微体系结构和指令集并初始化内部指针(最初为空 - 这就是您获得段错误的原因).

  • 是的,这很有效.我现在要坐在角落里戴着笨蛋帽.特别是考虑到我查看了解决方案的示例,但仍然没有注意到它. (2认同)