【发布时间】:2020-02-12 14:44:58
【问题描述】:
在CUDA编程中,如果两个内核之间存在数据依赖,我会尽量减少片外内存和片上内存之间的同步开销?这两种技术有什么区别?
【问题讨论】:
在CUDA编程中,如果两个内核之间存在数据依赖,我会尽量减少片外内存和片上内存之间的同步开销?这两种技术有什么区别?
【问题讨论】:
内核融合背后的想法是采用两个(或更多)离散操作,这些操作可以在单独的内核中实现(并且可能已经实现),然后将它们组合起来,以便所有操作都在单个内核中进行。
这样做的好处可能看起来也可能不明显,所以我推荐你this writeup。
持久线程/持久内核是一种内核设计策略,允许内核无限期地继续执行。典型的“普通”内核设计侧重于解决特定任务,当该任务完成时,内核退出(在内核代码的右花括号处)。
然而,持久内核中有一个控制循环,只有在发出信号时才会结束 - 否则它会无限期地运行。人们经常将其与应用程序设计的生产者-消费者模型联系起来。某些东西(主机代码)产生数据,而您的持久内核使用该数据并产生结果。这种生产者-消费者模型可以无限期地运行。当没有数据要消费时,消费者(你的持久内核)只是循环等待,等待新数据的呈现。
持久性内核设计有许多重要的考虑因素,我不会在此列出,而是请您参考this longer writeup/example。
好处:
内核融合可以将工作合并到单个内核中,从而通过减少不必要的负载和存储来提高性能 - 因为正在操作的数据可以原地保存在设备寄存器或共享内存中。
持久内核可能有多种好处。它们可能会减少与处理数据相关的延迟,因为不再需要 CUDA 内核启动开销。然而,另一个可能的性能因素可能是在设备寄存器或共享内存中保留状态(类似于内核融合)的能力。
内核融合不一定意味着持久内核。您可能只是将一组任务组合到一个内核中。一个持久的内核并不一定意味着单独的计算任务的融合——在一个管理“消费者”循环中可能只有一个“任务”正在执行。
但显然这两个想法之间存在相当大的概念重叠。
【讨论】: