0

我遇到了与此处所述的问题非常相似的问题:Intel CPU OpenCL in Mono 被 SIGXCPU (Ubuntu) 杀死

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

更具体地说,我的平台:它是 Ubuntu 12.04、OpenCL 1.1(带有 CUDA)和 mono 3.0.3。

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

一些事情:

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

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

有任何想法吗?

4

1 回答 1

0

这最终对我有用。

单声道有一个主要问题 - 它使用 SIGXCPU 进行 GC 处理(顺便说一句,这很奇怪)。不幸的是,OpenCL 也使用它,所以它会发生冲突。

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

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

./libgc/pthread_stop_world.c:# 定义 SIG_THR_RESTART SIGXCPU

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

用 SIGWINCH 替换 SIGXCPU 并重新编译。一个注意事项是我不确定它是否没有破坏某些东西,但现在看起来还不错,OpenCL 问题已经消失了。如果它破坏了某些东西(如 gui),则用您拥有的不同信号替换 SIGWINCH(signals.h 用于信号 defs)

于 2013-07-29T10:45:26.393 回答