【问题标题】:CPU killed by SIGXCPU using OpenCL and monoSIGXCPU 使用 OpenCL 和单声道杀死 CPU
【发布时间】:2013-07-26 10:42:28
【问题描述】:

我遇到了与这里所说的非常相似的问题:Intel CPU OpenCL in Mono killed by SIGXCPU (Ubuntu)

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

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

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

几件事:

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

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

有什么想法吗?

【问题讨论】:

  • 查看您链接到的帖子并发现使用较小的问题大小会使问题消失,我怀疑您已经达到了 OpenCL 内核允许的最长时间。在 Windows 上,有一些注册表项可以控制该超时。在 Linux 上,我不确定,但停止 X 窗口系统可能会有所帮助。 Linux 上的 CUDA 用户也遇到了同样的问题,因此 Nvidia 论坛上可能有解决方案。
  • 感谢您的回答,这不是因为这个创建是在 CPU 端。但是它会触发 GC(见下文)

标签: mono opencl gpu nvidia signal-handling


【解决方案1】:

这最终对我有用。

mono 有一个主要问题 - 它使用 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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-27
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多