前段时间我使用OpenCL(学校作业)编写了简单的boids模拟,使用C#,Cloo for OpenCL和OpenTK for OpenGL输出。我在Windows7上使用OpenCL的AMD CPU实现和朋友的NVidia进行了测试。 现在我在Linux上尝试过它(Ubuntu 12.04)。我安装了amd app sdk和intel sdk。它编译好了,参考CPU实现与图形输出工作正常。但是当我尝试运行OpenCL版本时,它会运行大约1秒钟(显示OpenGL中的有效输出),然后被SIGXCPU杀死。试图google一些已知的问题,但一无所获。 所以我试图捕捉并忽略该信号,但每次我尝试时,程序都会挂起。当我设置单声道以捕获一些不同的信号(例如SIGPIPE)时,它运行正常(减去opencl时的kill)。 在Mono中,我在FAQ中说过了Mono.UnixSignal 试图
Mono.Unix.Native.Stdlib.SetSignalAction ( Mono.Unix.Native.Signum.SIGXCPU, Mono.Unix.Native.SignalAction.Ignore);
然后不会挂起的东西,但也没有帮助:
Mono.Unix.Native.Stdlib.SetSignalAction ( Mono.Unix.Native.Signum.SIGXCPU, Mono.Unix.Native.SignalAction.Error);
甚至
ignore (0);
Mono.Unix.Native.Stdlib.signal(Mono.Unix.Native.Signum.SIGXCPU, new Mono.Unix.Native.SignalHandler (ignore));
与
static void ignore(int signal) {
}
即使我从main移除了其他所有内容,它仍然会在“触摸”该信号后的某个时间挂起。
还有一件奇怪的事情:
Mono.Unix.Native.Stdlib.SetSignalAction ( Mono.Unix.Native.Signum.SIGXCPU, Mono.Unix.Native.SignalAction.Default);
在Application.EnableVisualStyles()之后的某处使用SIGXCPU杀死应用程序;当我在此之前设置它,这次甚至没有触及OpenCL。
我在Mono中错过了什么吗?是否在内部某处使用此信号会妨碍OpenCl?
答案 0 :(得分:1)
SIGXCPU表示您已超出每个进程的时间限制。一旦超过它,你就超过了它。这个过程被卡住了。您需要使用ulimit或从管理员那里获得帮助来设置更高的限制。
答案 1 :(得分:1)
Mono在内部使用SIGXCPU用于它自己的目的,所以如果你忽略它(或由于某些其他原因引起它),事情就会破裂。