2012-10-25 119 views
3

我有一个CUDA内核可以完成我的工作,但是我也需要在CPU中完成一些辛苦的工作(用两个相同数组的位置进行计算),因为我无法在CUDA中编写(因为CUDA线程是不是同步的,我需要在数组的一个位置X上执行一项艰苦的工作,并且在执行z [x] = y [x] - y [x-1]之后,其中y是CUDA内核的数组结果,其中每个线程在这个数组的一个位置工作,z是存储结果的另一个数组)。所以我在CPU中这样做。如果同时从多个pthread中调用CUDA内核,会发生什么情况?

我有几个CPU线程来完成CPU端的工作,但是每个线程都调用了传递一些数据的CUDA内核。我的问题是:当多个CPU线程进行GPU调用时,GPU端发生了什么?如果我一次执行CUDA内核调用,然后创建多个CPU线程来完成CPU端工作,会更好吗?

回答

2

内核调用在单个流中排队并逐个执行。

但是,您可以在内核执行期间指定流 - 然后可以同时运行不同流中的CUDA操作,并且可以交织来自不同流的操作。 默认流为0。

参见:CUDA Streams and Concurrency

事情是相似时不同的过程使用相同的卡。

还记得内核是从CPU的东西异步执行。

2

在CUDA 4.0和更高版本上,多个线程可以共享相同的CUDA上下文,因此不再需要cuPush/PopContext。你只需要为每个线程调用cudaSetDevice。然后,提到@dzonder,你可以在不同的线程中使用流模拟运行多重内核。

相关问题