我有一个cuda内核,从单个CPU线程调用时工作正常。然而,当从多个CPU线程(~100)调用相同的内容时,大多数内核似乎根本没有被执行,因为结果全部为零。有人请指导我如何解决这个问题?
在当前版本的内核中,我在内核调用结束时使用cudadevicesynchronize()。在这种情况下,在cudaMalloc()和内核调用之前添加同步命令会有什么帮助吗?
还有一件事需要澄清。即如果两个CPU线程执行相同的cudaMalloc()命令,后者会在GPU内存中覆盖前者还是会创建自己的内存?
提前感谢您的帮助
答案 0 :(得分:5)
通常一个CPU线程可用于调用CUDA内核。但是,从CUDA 4.0开始,多个CPU线程可以共享上下文。您可以使用cuCtxSetCurrent
将内核的上下文绑定到当前线程。有关此API函数的更多信息,请参见here。
另一种解决方法是创建一个GPU工作线程来保存上下文并将任何CUDA请求传递给该线程。
关于你的另一个问题,没有为正确的线程设置上下文,我记得cudaMalloc甚至不会执行(我使用JCuda所以行为可能会有所不同)。但是如果上下文当前设置为调用内核,则不会覆盖内存。