我有一个使用Yeppp的应用程序! SIMD库。该应用程序是用C#编写的。它在Windows x86-32和x86-64上运行完美。但是,当我使用Mono在Raspberry Pi上运行应用程序时,我得到以下异常(不确定它是ARM问题,Mono问题还是其他问题)。我试过以root身份运行只是为了检查,也是同样的异常。我注意到堆栈跟踪的“UnixLibraryLoader”部分,所以我确保Yeppp DLL(Yeppp.CLR.Bundle.dll)与可执行文件位于同一目录中。这是我的代码,编译方式或库的问题吗?
Stacktrace:
at <unknown> <0xffffffff>
at (wrapper managed-to-native) Yeppp.UnixLibraryLoader.dlopen (string,int) <0xffffffff>
at Yeppp.UnixLibraryLoader.Yeppp.INativeLibraryLoader.LoadLibrary (string) <0x0002f>
at Yeppp.NativeLibrary..ctor (string,Yeppp.INativeLibraryLoader) <0x0006b>
at Yeppp.Loader.LoadNativeLibrary () <0x000db>
at Yeppp.Library.Init () <0x00027>
at <Module>..cctor () <0x0000b>
at (wrapper runtime-invoke) object.runtime_invoke_void (object,intptr,intptr,intptr) <0xffffffff>
at <unknown> <0xffffffff>
at SimdSpeedTest.Program.DisplayCpuFeatures () <0x00033>
at SimdSpeedTest.Program.Main (string[]) <0x000c7>
at (wrapper runtime-invoke) <Module>.runtime_invoke_void_object (object,intptr,intptr,intptr) <0xffffffff>
Native stacktrace:
Debug info from gdb:
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/arm-linux-gnueabihf/libthread_db.so.1".
[New Thread 0xb5b7b430 (LWP 2272)]
0xb6eabaac in waitpid () from /lib/arm-linux-gnueabihf/libpthread.so.0
Id Target Id Frame
2 Thread 0xb5b7b430 (LWP 2272) "mono" 0xb6ea9770 in sem_wait@@GLIBC_2.4 () from /lib/arm-linux-gnueabihf/libpthread.so.0
* 1 Thread 0xb6f80000 (LWP 2271) "mono" 0xb6eabaac in waitpid () from /lib/arm-linux-gnueabihf/libpthread.so.0
Thread 2 (Thread 0xb5b7b430 (LWP 2272)):
#0 0xb6ea9770 in sem_wait@@GLIBC_2.4 () from /lib/arm-linux-gnueabihf/libpthread.so.0
#1 0x001fff10 in mono_sem_wait (sem=0x2f523c, alertable=1) at mono-semaphore.c:119
#2 0x0017db28 in finalizer_thread (unused=<optimized out>) at gc.c:1073
#3 0x001625b4 in start_wrapper_internal (data=0xb0d8c8) at threads.c:643
#4 start_wrapper (data=0xb0d8c8) at threads.c:688
#5 0x001f5c30 in thread_start_routine (args=0xac86c0) at wthreads.c:294
#6 0x00204268 in inner_start_thread (arg=0xac86b4) at mono-threads-posix.c:49
#7 0xb6ea2c00 in start_thread () from /lib/arm-linux-gnueabihf/libpthread.so.0
#8 0xb6e0f728 in ?? () from /lib/arm-linux-gnueabihf/libc.so.6
#9 0xb6e0f728 in ?? () from /lib/arm-linux-gnueabihf/libc.so.6
Backtrace stopped: previous frame identical to this frame (corrupt stack?)
Thread 1 (Thread 0xb6f80000 (LWP 2271)):
#0 0xb6eabaac in waitpid () from /lib/arm-linux-gnueabihf/libpthread.so.0
#1 0x000b2148 in mono_handle_native_sigsegv (signal=<optimized out>, ctx=<optimized out>) at mini-exceptions.c:2299
#2 0x00027af8 in mono_sigsegv_signal_handler (_dummy=11, info=0xbe9280e0, context=0xbe928160) at mini.c:6777
#3 <signal handler called>
#4 0xb6f6d754 in ?? () from /lib/ld-linux-armhf.so.3
#5 0xbe9284a0 in ?? ()
Cannot access memory at address 0x3000
#6 0xbe9284a0 in ?? ()
Cannot access memory at address 0x3000
Backtrace stopped: previous frame identical to this frame (corrupt stack?)
答案 0 :(得分:3)
我猜想在RasPi的ARMV6 Hard-float架构上使用Mono,可能在处理Yepp(https://bitbucket.org/MDukhan/yeppp/src/40148ba4cdd00b03dfa880f6b7cecce83979c9d3/library/sources/library/Probe.arm.asm?at=default)中的特征检测代码发出的故意SIGILL方面遇到了麻烦,可能正在崩溃。
检测取决于SIGILL处理只是跳过不支持的指令。其他可能性是从资源中未正确检索lib(或者在Yeppp.Loader.LoadNativeLibrary猜测哪个本机lib用于运行它的体系结构时检索到错误的lib)并且在将执行传递给它时崩溃
我说你应该联系开发人员,因为我在网站上找不到任何引用,而且我仔细阅读的源文件表明支持RasPi及其旧版本的ARM。
PS:我假设您使用的是使用HardFloat的Raspbian,以及最新版本的Mono(最初使用的是不兼容的SoftFloat)。答案 1 :(得分:2)
现在赏金结束了,让我在这里回答我的意见。
您正在使用预览版本,因此它可能并不令您感到意外。
Raspberry Pi 1没有NEON但是VFP2。尽管向量浮点的误导性首字母缩略词(见arm-cortex-a8-whats-the-difference-between-vfp-and-neon和VFP SIMD Instructions, howto?),VFP指令不是SIMD指令。
VFPv2是随ARMv5TE,ARMv5TEJ和ARMv6架构引入的。因此即使the source code for Yeppp!没有明确引用ARMV6,也不一定意味着它不支持VFPv2,因为它确实引用了ARMV5T。
使用Yeppp有什么好处!使用Raspberry Pi 1然后VFP指令不是SIMD指令?我的猜测是GCC没有很好地实现这些,所以用Yeppp明确地做它可能是有利的。
我不确定Raspberry PI 1的高峰失误是什么。 However, benchmarks have measured
The cortex A7 cores, which which has NEON and VFP3, of the Raspberry Pi 2 can do:
Raspberry Pi 2有四个内核,因此PEAK触发器为4* FLOPs/cycle/core.
注意,具有Cortex-A7的Neon的峰值FLOPS与VFP的峰值FLOPS相同。 Cortex-A7是与Cortex-A15兼容的100%二进制指令集,这就是它在ARM big.LITTLE设计中使用的原因。所以Neon在Cortex-A7中实现只是为了兼容。
我还不了解每个周期的整数运算。
但是,Raspberry PI 1和2还有另一个SIMD选项。您可以在VideoCore IV上使用Integer SIMD指令(另请参阅NEON instruction set support SIMD)。你可以用这个来实现固定点。无论如何,这可能会给你带来比NEON更多的性能。
答案 2 :(得分:2)
Yeppp!支持两个Linux ARM平台:
ARMv5TE + soft-float
ABI(arm-linux-gnueabi
)ARMv7-A + hard-float
ABI(arm-linux-gnueabihf
) Raspberry Pi的大多数Linux发行版使用异常ARMv6 + hard-float
ABI。 Yeppp!的ARMv7-A + hard+float
版本使用了Thumb-2指令,Raspberry Pi不支持这些指令。这就是为什么在尝试使用它时会得到SIGILL
。
我可以建议两种解决方法: