【问题标题】:What happen if a CUDA kernel is called from multiple pthreads simultaneously?如果同时从多个 pthread 调用 CUDA 内核会发生什么?
【发布时间】:2012-10-25 17:55:41
【问题描述】:

我有一个 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 方面的工作会更好吗?

【问题讨论】:

    标签: cuda pthreads


    【解决方案1】:

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

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

    见:CUDA Streams and Concurrency

    不同进程使用同一张卡时情况相似。

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多