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

Gen*_*tek 1 multithreading cuda gpu gpgpu thread-safety

我有一个cuda内核,当从单个CPU线程调用时,它可以正常工作。但是,当从多个CPU线程(〜100)调用同一内核时,大多数内核似乎根本不执行,因为结果全为零。有人可以指导我如何解决此问题吗?

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

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

在此先感谢您的帮助

M2X*_*M2X 5

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

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

关于您的其他问题,我没有为适当的线程设置上下文,我记得cudaMalloc甚至不会执行(我使用JCuda,因此行为可能有所不同)。但是,如果当前将上下文设置为调用内核,则不会覆盖内存。