前段时间,我使用 OpenCL(是学校作业)编写了简单的 boids 模拟,使用 C#、用于 OpenCL 的 Cloo 和用于 OpenGL 输出的 OpenTK。我在 Windows7 上使用 AMD CPU 实现 OpenCL 和朋友的 NVidia 对其进行了测试。现在我在 Linux (Ubuntu 12.04) 上试了一下。我安装了amd app sdk和intel sdk。它编译正常,参考 CPU 实现与图形输出工作正常。但是当我尝试运行 OpenCL 版本时,它会运行大约 1 秒(显示 OpenGL 中的有效输出),然后被 SIGXCPU 杀死。试图谷歌一些已知问题,但一无所获。所以我试图捕捉并忽略这个信号,但每次我尝试时,程序都会挂起。当我将单声道设置为捕获一些不同的信号(例如 SIGPIPE)时,它运行正常(减去 opencl 时的终止)。在 Mono 中,我尝试了常见问题解答中所述的 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?