SIGXCPU使用OpenCL和mono杀死CPU

时间:2013-07-26 10:42:28

标签: mono opencl gpu nvidia signal-handling

我遇到的问题非常类似于Intel CPU OpenCL in Mono killed by SIGXCPU (Ubuntu)

基本上,我有一个非常简单的C#应用​​程序使用OpenCL(通过OpenCL.Net包装器,但它不应该有所作为,因为它只是包装本机函数而已。)。在代码中我只是构建内核然后分配一大堆浮点数。

更具体的我的平台:它是Ubuntu 12.04,OpenCL 1.1(带CUDA)和单声道3.0.3。

问题:通过单声道运行我的代码时出现CPU LIMIT EXCEEDED错误

少数事情:

  • 如果我在构建内核和分配之间的某个地方设置一个断点(在monodevelop中)它可以工作..
  • 将数组大小更改为小型也可以使其正常工作

Strace没有显示任何有用的东西。我也尝试将回调函数传递给ClBuildProgram(注意:如果我用ClBuildProgram注释掉它的行,那就可以了。)

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

这最终对我有用。

单声道存在一个主要问题 - 它使用SIGXCPU进行GC处理(这很奇怪)。不幸的是,OpenCL也使用它,因此它会发生冲突。

解决方法是修改单声道代码。

转到源目录和grep -r SIGXCPU。在我的单声道(3.0.3)中有2个重要文件

./ libgc / pthread_stop_world.c:#define SIG_THR_RESTART SIGXCPU

./ mono / metadata / sgen-os-posix.c:const static int restart_signal_num = SIGXCPU;

用SIGWINCH替换SIGXCPU并重新编译。需要注意的是,我不确定它是否没有破坏,但现在看起来还行,OpenCL问题已经消失。如果它破坏某些东西(比如gui)用你拥有的不同信号替换SIGWINCH(signal.h用于信号defs)