Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 如何管理来自多个CPU线程的同一CUDA内核调用?_Multithreading_Cuda_Thread Safety_Gpu_Gpgpu - Fatal编程技术网

Multithreading 如何管理来自多个CPU线程的同一CUDA内核调用?

Multithreading 如何管理来自多个CPU线程的同一CUDA内核调用?,multithreading,cuda,thread-safety,gpu,gpgpu,Multithreading,Cuda,Thread Safety,Gpu,Gpgpu,我有一个cuda内核,当从单个CPU线程调用它时,它可以正常工作。但是,当从多个CPU线程(~100)调用相同的函数时,大多数内核似乎根本不会执行,因为结果都是零。有人能告诉我如何解决这个问题吗 在当前版本的内核中,我在内核调用结束时使用了。在这种情况下,在内核调用之前添加一个sync命令会有帮助吗 还有一件事需要澄清。i、 e.如果两个CPU线程执行同一个cudamaloc()命令,后者会在GPU内存中覆盖前者还是创建自己的内存 提前感谢您的帮助通常可以使用一个CPU线程来调用CUDA内核。但

我有一个cuda内核,当从单个CPU线程调用它时,它可以正常工作。但是,当从多个CPU线程(~100)调用相同的函数时,大多数内核似乎根本不会执行,因为结果都是零。有人能告诉我如何解决这个问题吗

在当前版本的内核中,我在内核调用结束时使用了。在这种情况下,在内核调用之前添加一个sync命令会有帮助吗

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


提前感谢您的帮助

通常可以使用一个CPU线程来调用CUDA内核。但是,自CUDA4.0以来,多个CPU线程可以共享上下文。您可以使用
cuCtxSetCurrent
将内核的上下文绑定到当前线程。可以找到有关此API函数的更多信息

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


关于你的另一个问题,如果没有为适当的线程设置上下文,我记得cudamaloc甚至不会执行(我与JCuda一起工作,因此行为可能会有点不同)。但是,如果当前将上下文设置为调用内核,则不会覆盖内存。

通常可以使用一个CPU线程调用CUDA内核。但是,自CUDA4.0以来,多个CPU线程可以共享上下文。您可以使用
cuCtxSetCurrent
将内核的上下文绑定到当前线程。可以找到有关此API函数的更多信息

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


关于你的另一个问题,如果没有为适当的线程设置上下文,我记得cudamaloc甚至不会执行(我与JCuda一起工作,因此行为可能会有点不同)。但是,如果当前将上下文设置为调用内核,则不会覆盖内存。

相同内核-->相同数组-->可能相同元素-->未定义行为。尝试使用不同名称和不同缓冲区的同一内核。是否建议为每个线程创建具有不同名称的内核副本?如果可以从初始.cu文件以编程方式创建新的.cu文件,则应该尝试。编译时间可能会增加。我曾经在我的raytracer递归函数(伪递归)中使用过一次,你在做什么吗?我认为从100个不同的线程调用同一个内核100次都没有问题。下面是一个使用pthreads的示例。如果您进行适当的错误检查,并仔细检查数据管理,很可能会发现问题。或者发布一个失败的简单示例。您不必为每个线程创建具有不同名称的内核。您不应该让两个线程执行相同的
cudamaloc()
命令。指针只应传递到
cudamaloc
一次,然后再传递到
cudaFree()
相同内核-->相同数组-->可能相同元素-->未定义行为。尝试使用不同名称和不同缓冲区的同一内核。是否建议为每个线程创建具有不同名称的内核副本?如果可以从初始.cu文件以编程方式创建新的.cu文件,则应该尝试。编译时间可能会增加。我曾经在我的raytracer递归函数(伪递归)中使用过一次,你在做什么吗?我认为从100个不同的线程调用同一个内核100次都没有问题。下面是一个使用pthreads的示例。如果您进行适当的错误检查,并仔细检查数据管理,很可能会发现问题。或者发布一个失败的简单示例。您不必为每个线程创建具有不同名称的内核。您不应该让两个线程执行相同的
cudamaloc()
命令。指针应该只传递到
cudamaloc
一次,然后再传递到
cudaFree()
非常感谢您的回复。我肯定会在我未来的任务中使用它,但对于我目前的情况,正如所建议的那样,纹理内存将只有一个实例。我认为主要的问题是纹理记忆。如果时间允许,我将尝试用全局内存替换纹理,以检查问题是否仍然存在。非常感谢您的回复。我肯定会在我未来的任务中使用它,但对于我目前的情况,正如所建议的那样,纹理内存将只有一个实例。我认为主要的问题是纹理记忆。如果时间允许,我将尝试用全局内存替换纹理,以检查问题是否仍然存在。