首页 文章

CUDA不同流之间的内核间通信

提问于
浏览
0

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

这是高端GPU(费米/特斯拉),CUDA 4.2

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

4 回答

  • 2

    CUDA编程模型仅支持同一线程块中的线程之间的通信(第2.2节“线程层次结构”末尾的CUDA C Programming Guide) . 这不能通过当前的CUDA API可靠地实现 . 如果你尝试,你可能会找到部分成功 . 但是,这将在不同的操作系统,应用程序的不同执行中失败,并且这将被未来的驱动程序更新和新硬件(GK110支持增强的并发模型)打破 .

  • 0

    您需要在主机上进行同步 . 从我的头脑中,依次为每个流调用cudaDeviceSynchronize应该可以做到这一点,但可能并不那么容易 .

  • 0
    • 您的数据必须位于全局内存中

    • 您需要获取主机上的数据地址

    • 您必须将此数据发送回第二个内核

    您的代码必须与此类似:

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

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

    但请注意,流同步会减慢进程,因此您应尽可能避免使用它 . 你也可以通过cuda事件获得流同步,它不那么明显并且没有特别的优势,但知道它是有用的;-)

  • 0

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

    • 内核间数据交换

    • 内核间同步

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

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

    CUDA C Programming Gide v7.5告诉我们:“应用程序通过流管理上述并发操作 . 流是一系列命令(可能由不同的主机线程发出),按顺序执行 . 另一方面,不同的流可能无序地执行命令相互之间或同时发生;这种行为不能保证,因此不应依赖于正确性(例如, inter-kernel communication is undefined ) . “

相关问题