内核融合和持久线程之间有什么区别?

时间:2019-10-15 21:21:17

标签: cuda gpu gpgpu cudnn

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

1 个答案:

答案 0 :(得分:2)

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

这样做的好处可能显而易见,所以我推荐您参考this writeup

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

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

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

好处:

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

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

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

但是,这两个想法之间显然存在大量的概念重叠。