无法关闭在NVIDIA GPU上运行的错误内核

5

我遇到了麻烦,请帮忙,这很紧急。

我有一个主机进程,生成多个宿主(CPU)线程(pthreads)。这些线程会调用CUDA内核。这些CUDA内核是由外部用户编写的。因此,可能会有坏内核进入无限循环。为了克服这个问题,我设置了一个2分钟的超时时间,将杀死相应的CPU线程。

杀死CPU线程是否也会杀死在GPU上运行的内核?就我所测试的来看,不会。

如何杀死目前在GPU上运行的所有线程?

编辑:我之所以使用调用内核的CPU线程,是因为服务器有两个Tesla GPU。因此,线程将交替在GPU设备上安排内核。

谢谢, Arvind

3个回答

1

除非我没有理解更大的部分,否则您最好使用CUDA Streams API进行多设备任务处理,但可能会有所不同。

至于杀死进程; 如果您正在运行带有显示器(和x服务器)的卡,它们将在5秒后自动超时(同样,可能会有所不同)。

假设这不是情况,请查看从“父”线程调用cudaDeviceReset() API参考; 在您自己指定的“kill”超时之后。

我还没有在自己的代码中实现此功能,所以老实说我不知道它是否适用于您的情况,但值得调查。


1

好像不行。我运行了一个有问题的内核,其中一个设备似乎无限期地被锁定了(直到重新启动)。我不确定如何终止正在运行的内核。不过,我认为可以通过驱动程序限制内核执行时间,这可能是可行的方法。


0
杀死CPU线程是否也会杀死在GPU上运行的内核?根据我的测试,好像不会。
可能不会。在Linux上,您可以使用cuda-gdb来找出答案。
我不明白为什么要使用线程将多个内核发送到GPU..如果同时发送多个内核到GPU会发生什么.. GPU的线程调度程序会处理吗?

我需要发送分离的内核到GPU,因为上下文不同。也就是初始化数据可能会发生变化。关于使用线程...该平台是针对CPU设计的。但后来我们也将其重用于GPU上。我认为这并不重要。GPU调度程序将排队内核请求(这是我所认为的,但也可能我错了)。 - arvindkgs
试了一下,是这样的.. 你能找出它的问题在哪里吗?你用的是什么平台?(Linux、Windows 还是 Mac?) - Nils

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接