3

我有一个 CUDA 内核来完成我的艰苦工作,但我也有一些艰苦的工作需要在 CPU 中完成(使用同一数组的两个位置进行计算),而我无法在 CUDA 中编写(因为 CUDA 线程不是同步的) ,我需要对数组的位置 X 进行艰苦的工作,然后在 z[x] = y[x] - y[x - 1] 之后,其中 y 是每个线程工作的 CUDA 内核的数组结果这个数组的一个位置,z 是另一个存储结果的数组)。所以我在CPU中做这个。

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

4

2 回答 2

2

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

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

请参阅:CUDA 流和并发

当不同的进程使用同一张卡时,情况是相似的。

还要记住,内核是从 CPU 东西异步执行的。

于 2012-10-25T09:46:14.487 回答
2

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

于 2012-10-25T09:55:41.723 回答