任何Yeppp的分割错误! API调用

说实话,这是我第一次使用像Yeppp!这样的图书馆,我的意思是SIMD图书馆有dynamic的运行时select,或者他们会说出来。 最终的结果是库应该select最佳的SIMD汇编代码,以运行在任何平台和运行的硬件上。

这似乎是在我的一个项目中使用的一个很好的工具,但是,正如标题所述,我不能调用任何Yeppp! function没有发生分段故障。 我所能得到的debugging信息也没有帮助。

我的系统configuration是:

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! select正确的运行时间,这可能是问题。

下面是我正在使用的简单testing代码,虽然我尝试了其他Yeppp! function与各种数据types,这是所有相同的分段错误。 我也尝试过像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> 

这看起来很标准。 但是,当进入我得到的function:

 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 

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

 0 No function contains specified address. 

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

我几乎已经死了,为什么它会这样做,除非Yeppp! 本身是有缺陷的。 自从Yeppp 1.0发布以来! 图书馆只有几天的时间,我一直没能find任何有类似问题或任何问题的人。

PS:这是我长久以来第一次公开提出有关编程的问题,所以如果需要进一步的信息来帮助解决这个问题的话,我会很乐意提供的。

在使用库(和yepLibrary_Release()完成之后yepLibrary_Init() ,您需要调用yepLibrary_Init() )。 此函数检测CPU微架构和指令集,并初始化内部指针(最初为空 – 这就是为什么会出现段错误)。