3

老实说,这是我第一次使用任何类型的库,例如 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:这是我很长时间以来第一次公开询问有关编程的问题,所以如果需要任何进一步的信息来帮助解决这个问题,我会很乐意提供。

4

1 回答 1

5

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

于 2013-09-20T12:56:56.727 回答