有没有人在2个不同的CUDA流中成功运行2个不同的内核并让它们同步?基本上我想让1个内核A将数据发送到另一个并发运行的内核B(在不同的流中),然后返回结果。原因是:内核A在1个CUDA线程中运行,我想为内核B实现多GPU线程实现。
这是高端GPU(费米/特斯拉),CUDA 4.2
相同的GPU,不同的流。因此,数据应该能够通过设备内存进行通信,但如何同步呢?
答案 0 :(得分:2)
CUDA编程模型仅支持同一线程块(2.2 {Thread Hierarchy一节末尾的CUDA C Programming Guide)中的线程之间的通信。这不能通过当前的CUDA API可靠地实现。如果你尝试,你可能会发现部分成功。但是,这将在不同的操作系统,应用程序的不同执行中失败,并且这将被未来的驱动程序更新和新硬件打破(GK110支持增强的并发模型)。
答案 1 :(得分:0)
您需要在主机上进行同步。从头到尾,依次为每个流调用cudaDeviceSynchronize应该可以做到这一点,但可能不那么容易。
答案 2 :(得分:0)
您的代码必须与此类似:
* dataToExchange_h,* dataToExchange_d;
cudaMalloc((void **)dataToExchange,sizeof(data));
kernel1<<< M1,N1,0,流1>>>(dataToExchange);
cudaStreamSynchronize(流1);
kernel2<<< M2,N2,0,STREAM2>>>(dataToExchange);
但请注意,流同步会降低进程的速度,因此您应尽可能避免使用它。 你也可以通过cuda事件获得流同步,它不那么明显并且没有特别的优势,但知道它是有用的; - )
答案 3 :(得分:0)
如果我正确地发现了你的问题,你有两个问题:
1)可以通过在全局设备内存中共享数据来实现内核间数据交换。
2)据我所知,CUDA提供的内核间同步没有可靠的设施。而我并不知道可以在这里应用的任何合适的技巧。
CUDA C Programming Gide v7.5告诉我们: "应用程序通过流管理上述并发操作。流是按顺序执行的一系列命令(可能由不同的主机线程发出)。另一方面,不同的流可以相对于彼此无序地或同时地执行它们的命令;此行为无法保证,因此不应依赖于正确性(例如,内核间通信未定义)。"