0

有没有人在 2 个不同的 CUDA 流中成功运行 2 个不同的内核并让它们同步?基本上我想让 1 个内核 A 将数据发送到另一个同时运行的内核 B(在不同的流中),然后返回结果。原因:内核 A 在 1 个 CUDA 线程中运行,我想要内核 B 的多 GPU 线程实现。

这是使用高端 GPU (Fermi/Tesla)、CUDA 4.2

相同的 GPU,不同的流。所以数据应该能够通过设备内存进行通信,但是如何同步它们呢?

4

4 回答 4

2

The CUDA Programming Model only supports communication between threads in the same thread block (CUDA C Programming Guide at the end of section 2.2 Thread Hierarchy). This cannot be reliably implemented through the current CUDA API. If you try you may find partial success. However, this will fail on different OSes, different executions of your application, and this will be broken by future driver updates and new hardware (GK110 supports enhanced concurrency model).

于 2012-08-09T05:10:43.867 回答
1

如果我正确地抓住了你的问题,你有两个问题:

  1. 内核间数据交换
  2. 内核间同步

1)内核间数据交换可以通过共享全局设备内存中的数据来实现。

2)据我所知,CUDA没有提供可靠的内核间同步设施。而且我不知道可以在这里应用任何合适的技巧。

CUDA C Programming Gide v7.5告诉我们:“应用程序通过流管理上述并发操作。流是按顺序执行的命令序列(可能由不同的主机线程发出)。另一方面,不同的流可能相对于彼此无序或同时执行它们的命令;不能保证这种行为,因此不应依赖于正确性(例如,内核间通信未定义)。

于 2016-09-25T12:18:25.867 回答
0
  • 您的数据必须在全局内存中
  • 需要获取主机上的数据地址
  • 您必须将此数据发送回第二个内核

您的代码必须与此类似:

*dataToExchange_h,*dataToExchange_d;
cudaMalloc((void**)dataToExchange, sizeof(data));

kernel1<<< M1,N1,0,stream1>>>(dataToExchange);
cudaStreamSynchronize(stream1);
kernel2<<< M2,N2,0,stream2>>>(dataToExchange);

但请注意,流同步会减慢该过程,因此您应尽可能避免它。您还可以通过 cuda 事件获得流同步,它不太明显并且没有特别的优势,但了解它很有用;-)

于 2012-08-22T02:20:04.063 回答
0

您将需要在主机上进行同步。从我的脑海中,依次为每个流调用 cudaDeviceSynchronize 应该可以解决问题,但它可能并不那么容易。

于 2012-08-08T21:20:43.070 回答