1

前段时间,我使用 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?

4

2 回答 2

1

SIGXCPU 意味着您已经超过了每个进程的时间限制。一旦你超过了它,你就已经超过了它。进程卡住了。您需要使用 ulimit 或从管理员那里获得帮助来设置更高的限制。

于 2012-10-30T20:54:54.280 回答
1

Mono 在内部出于自己的目的使用 SIGXCPU,因此如果您忽略它(或者由于其他原因而引发它),事情就会中断。

于 2012-10-30T21:19:16.450 回答