如何从多个CPU线程管理相同的CUDA内核调用?

时间:2014-02-14 12:53:37

标签: multithreading cuda thread-safety gpu gpgpu

我有一个cuda内核,从单个CPU线程调用时工作正常。然而,当从多个CPU线程(~100)调用相同的内容时,大多数内核似乎根本没有被执行,因为结果全部为零。有人请指导我如何解决这个问题?

在当前版本的内核中,我在内核调用结束时使用cudadevicesynchronize()。在这种情况下,在cudaMalloc()和内核调用之前添加同步命令会有什么帮助吗?

还有一件事需要澄清。即如果两个CPU线程执行相同的cudaMalloc()命令,后者会在GPU内存中覆盖前者还是会创建自己的内存?

提前感谢您的帮助

1 个答案:

答案 0 :(得分:5)

通常一个CPU线程可用于调用CUDA内核。但是,从CUDA 4.0开始,多个CPU线程可以共享上下文。您可以使用cuCtxSetCurrent将内核的上下文绑定到当前线程。有关此API函数的更多信息,请参见here

另一种解决方法是创建一个GPU工作线程来保存上下文并将任何CUDA请求传递给该线程。

关于你的另一个问题,没有为正确的线程设置上下文,我记得cudaMalloc甚至不会执行(我使用JCuda所以行为可能会有所不同)。但是如果上下文当前设置为调用内核,则不会覆盖内存。