【问题标题】:Kernel invoking delay on CUDA with Streams使用 Streams 在 CUDA 上调用内核延迟
【发布时间】:2017-10-27 07:49:04
【问题描述】:

我从头开始为 CUDA 创建了扫描算法,并尝试将其用于小于 80,000 字节的较小数据量。

创建了两个单独的实例,一个在可能的情况下使用流运行内核,另一个仅在默认流中运行。

我观察到,对于这个数据大小范围,与其他方法相比,使用流运行需要更长的时间来完成任务。

当使用 nvprofiler 进行分析时,观察到对于较小的数据量,在流中运行不会为单独的内核提供并行性

没有流

使用流

但是当数据大小增加时,可以获得某种并行性

具有 400,000 字节的流

我的问题是,是否有一些额外的参数可以减少这个内核调用时间延迟,或者对于使用流不利的较小数据大小有这种行为是否正常

更新:

我还包含了运行时 API 调用时间线以澄清答案

【问题讨论】:

    标签: cuda cuda-streams


    【解决方案1】:

    通常,您的数据太小,无法在第一种情况下充分利用 GPU。如果您在 nvvp 中查看“运行时 API”的时间线,您会发现启动内核需要几微秒的时间。如果流 13 中的第一个内核太短,流 14 中的第二个内核可能尚未启动,因此流之间没有并行性。

    由于这些开销,如果数据很小,您可能会发现在 CPU 上运行程序会更快。

    【讨论】:

    • 这也是我所怀疑的。仍然从时间线上我可以看到第二个内核的 cudaLaunch API 调用在第一个内核的执行结束之前结束。所以从技术上讲,第二个内核仍然可以在第一个内核完成之前运行。我希望是否有可能将 API cudaLaunch 时间减少到实际的内核执行时间。但我认为正如您提到的,由于数据量较小,此启动到执行时间相当长。你是正确的,因为 CPU 在低数据量下优于 GPU。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-07
    • 2021-08-25
    • 2014-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-06
    相关资源
    最近更新 更多