在Raspbery Pi上运行带有Mono的Yeppp库

时间:2015-06-09 19:32:20

标签: c# mono raspberry-pi simd yeppp

我有一个使用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?)

3 个答案:

答案 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-neonVFP 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

  • 0.041 DP GFLOPS
  • 0.192 SP GFLOPS

The cortex A7 cores, which which has NEON and VFP3, of the Raspberry Pi 2 can do

  • 0.5 DP FLOPs / cycle:标准VMLA.F64每四个循环。
  • 1.0 DP FLOPs / cycle:每个周期标量VADD.F64。
  • 2.0 SP FLOPs / cycle:标量VMLA.F32每个循环。
  • 2.0 SP FLOPs / cycle:每隔一个周期使用2个宽的VMLA.F32。

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

我可以建议两种解决方法:

  • 将Raspberry Pi与软浮动Linux发行版一起使用
  • 使用Raspberry Pi 2,它支持ARMv7-A(以及Thumb-2)