【问题标题】:Concurrent: Short copy, Long kernel并发:短拷贝,长内核
【发布时间】:2017-10-27 07:58:35
【问题描述】:

运行并发复制和内核操作时:
如果我的内核运行时间是 dataCopy 操作的两倍,每次内核运行我会得到 2 个副本吗?
我看到的流示例显示了 1:1 的关系。 (复制时间=内核运行时间。)我想知道当有什么不同时会发生什么。每次内核启动总是有一个复制操作(最大)吗?或者复制操作是否独立于内核启动运行?即,如果运行和复制时间按这种方式计算,我可能会在每次内核启动时完成 5 次复制操作。
(我试图弄清楚在内核启动之前要排队多少次复制操作。)

一对一:(复制时间 = 内核运行时间)

................................

二比一:(复制时间 = 1/2 内核运行时间)

.............................

【问题讨论】:

    标签: cuda cuda-streams


    【解决方案1】:

    每次内核启动您可以拥有多个副本。只有一个副本(在具有双副本引擎的设备上的每个方向)可以在特定时间运行到特定 GPU,但是一旦该副本完成,可以立即启动另一个副本。假设 niether 流是流 0,则在相关内核启动流之外的流中发出的异步副本将完全异步运行到该内核启动。(这也假设您使用固定内存,即 cudaHostAlloc 来创建相关的主机端缓冲区。)

    您可能需要阅读最佳实践指南中的relevant section

    您经常看到计算和复制的 1:1 分析的原因是假设复制的数据将由内核调用消耗(或由内核调用产生),因此在逻辑上我们可以想到数据块这边走。但是,如果将代码构造为一系列副本更容易,那应该没有问题。当然,如果您可以将所有数据批处理到单个 cudaMemcpy 调用中,那将比传输相同数据的一系列副本更有效。

    visual profiler 将帮助您以时间线方式准确了解数据复制操作与内核操作的比较情况。

    【讨论】:

    • 我对 Visual Profiler 的理解是这只适用于 Win 环境。非Win env 有类似的工具吗?
    • 是的,在 linux 环境中,您可以使用 nvvp 命令运行可视化分析器,或者如果您有 CUDA 5,则可以通过运行 nsight 命令从 nsight Eclipse 版工具中访问它.您可能想查看我在回答中链接的文档,特别是 this section
    猜你喜欢
    • 1970-01-01
    • 2012-04-19
    • 1970-01-01
    • 2013-08-22
    • 1970-01-01
    • 1970-01-01
    • 2012-02-20
    • 2012-04-12
    • 1970-01-01
    相关资源
    最近更新 更多