【问题标题】:Is better to use one big kernel or cuda streams?使用一个大内核或 cuda 流更好吗?
【发布时间】:2012-05-06 10:59:49
【问题描述】:

什么更好?我需要分几个步骤处理数据,在我看来,我有 2 个选项: 1)使用一个大内核 2) 每一步使用带有一个内核的流

在执行内核之前会有一些延迟,但在这种情况下真的很重要吗?大内核的延迟与几个较小内核的延迟总和是否相同?

与另一种相比,一种方式有什么优势吗?

谢谢大家。

【问题讨论】:

    标签: cuda


    【解决方案1】:

    Fermi 卡上内核的启动延迟约为 10us,因此无需担心。这是有道理的——要在游戏中渲染场景,必须运行许多不同的着色器(它们是内核)。

    内核必须从全局内存中读取将要处理的数据,并将结果写回全局内存。因此,每个单独的内核都意味着完整的读/写周期。如果您能够在一个大内核中将多个步骤链接在一起,您可能能够加快速度,但仍被单个读/写周期包围。

    例如,如果您需要执行操作 A、B 和 C,链接它们可能会给您 READ - A - B - C - WRITE,而单独的内核会给您 READ - A - WRITE - READ - B - WRITE - 读 - C - 写。

    请记住,即使您运行单个内核,您仍然可以通过将单独的步骤分解为单独的设备功能来保持代码的可读性。

    【讨论】:

    • 大内核也有很大的寄存器占用空间,这会对性能产生重大影响。
    • 我没有检查过,但理论上,如果变量在链中的步骤之间不共享,编译器应该能够继续重用寄存器,以便总寄存器使用量仅等于步骤的总使用量使用最多的。即便如此,这是一个很好的观点,并且应该以同样的方式考虑共享内存的使用。换句话说,如果链中一个步骤的资源使用率远高于其他步骤,则可能会降低其他步骤的占用率,因此最好单独运行。
    • 谢谢,我将使用设备功能和一个大内核。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 2012-12-24
    • 2012-01-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多