【问题标题】:What's the differences between the kernel fusion and persistent thread?内核融合和持久线程有什么区别?
【发布时间】:2020-02-12 14:44:58
【问题描述】:

在CUDA编程中,如果两个内核之间存在数据依赖,我会尽量减少片外内存和片上内存之间的同步开销?这两种技术有什么区别?

【问题讨论】:

    标签: cuda gpu gpgpu


    【解决方案1】:

    内核融合背后的想法是采用两个(或更多)离散操作,这些操作可以在单独的内核中实现(并且可能已经实现),然后将它们组合起来,以便所有操作都在单个内核中进行。

    这样做的好处可能看起来也可能不明显,所以我推荐你this writeup

    持久线程/持久内核是一种内核设计策略,允许内核无限期地继续执行。典型的“普通”内核设计侧重于解决特定任务,当该任务完成时,内核退出(在内核代码的右花括号处)。

    然而,持久内核中有一个控制循环,只有在发出信号时才会结束 - 否则它会无限期地运行。人们经常将其与应用程序设计的生产者-消费者模型联系起来。某些东西(主机代码)产生数据,而您的持久内核使用该数据并产生结果。这种生产者-消费者模型可以无限期地运行。当没有数据要消费时,消费者(你的持久内核)只是循环等待,等待新数据的呈现。

    持久性内核设计有许多重要的考虑因素,我不会在此列出,而是请您参考this longer writeup/example

    好处:

    1. 内核融合可以将工作合并到单个内核中,从而通过减少不必要的负载和存储来提高性能 - 因为正在操作的数据可以原地保存在设备寄存器或共享内存中。

    2. 持久内核可能有多种好处。它们可能会减少与处理数据相关的延迟,因为不再需要 CUDA 内核启动开销。然而,另一个可能的性能因素可能是在设备寄存器或共享内存中保留状态(类似于内核融合)的能力。

    内核融合不一定意味着持久内核。您可能只是将一组任务组合到一个内核中。一个持久的内核并不一定意味着单独的计算任务的融合——在一个管理“消费者”循环中可能只有一个“任务”正在执行。

    但显然这两个想法之间存在相当大的概念重叠。

    【讨论】:

    • 如果状态依赖只是从层到层,而不是从一个通过网络“持续”到下一个,那么内核融合是有意义的。例如,NVIDIA TensorRT 使用this methodology 进行推理。但是,如果状态依赖从一次通过网络持续到下一次,例如。用于训练,然后是一个持久的内核设计来保存,例如baidu 所描述的“权重”可能是明智的。
    • 嗨罗伯特。感谢您的澄清。它确实帮助了我。这里我有一种情况,例如对于 DNN 或 RNN,如果内核之间存在依赖关系,让 sya 某些层需要之前层的输出,哪个更好以避免同步开销?
    • 您好,谢谢。我还注意到所有这些技术都适用于 RNN,很少用于 DNN。有什么具体的吗?
    • 对于内核融合,如果我们融合多个内核,我们可以获得更大的一个。如果 GPU 内存不足以容纳更大的内存怎么办?
    • 我认为在所有这些中没有任何特定于 RNN 或 DNN 的内容。关于 TensorRT 的 cmets 肯定适用于 DNN。如果 GPU 内存不足以完成您正在尝试做的事情,那么您显然无法做到这一点,并且需要提出其他方法。例如,现代 GPU 支持内存超额订阅。
    猜你喜欢
    • 1970-01-01
    • 2015-01-08
    • 2016-12-31
    • 2010-10-15
    • 2011-05-31
    • 2010-09-15
    • 2015-04-06
    • 1970-01-01
    • 2012-07-05
    相关资源
    最近更新 更多