天天看点

CUDA学习(五十八)

CUDA动态并行:

介绍:

概括:

动态并行是对CUDA编程模型的扩展,使CUDA内核能够直接在GPU上创建和同步新的工作。 在需要的程序中动态创建并行性可以提供令人兴奋的新功能。

直接从GPU创建工作的能力可以减少在主机和设备之间传输执行控制和数据的需求,因为现在可以通过在设备上执行的线程在运行时进行启动配置决策。 此外,数据相关的并行工作可以在运行时在内核内部生成,动态利用GPU的硬件调度程序和负载平衡器,并根据数据驱动的决策或工作负载进行调整。 之前需要进行修改以消除递归,不规则循环结构或其他不符合平面单层并行性的构造的算法和编程模式可能会更加透明地表达。

本文档描述了支持动态并行机制的CUDA的扩展功能,包括对利用这些机制所必需的CUDA编程模型的修改和补充,以及利用此增加容量的指导原则和最佳实践。

动态并行性仅受计算能力3.5及更高版本的设备支持。(哈哈,感觉相对于前面的这节会很重要,和Pytorch的动态计算图名字上蛮像的,我的1060终于可以用上了)

Glossary:

本指南中使用的术语的定义;

网格(Grid):

网格(Grid)是线程(Threads)的集合。 网格中的线程执行内核功能并分为线程块(Thread Blocks)。

线程块(Thread Block):

线程块是一组在同一个多处理器(SMX)上执行的线程。 线程块内的线程可以访问共享内存,并且可以显式同步。

内核函数:

内核函数是隐式并行子例程,在CUDA执行和内存模型下为网格中的每个线程执行。

主机:

主机指的是最初调用CUDA的执行环境。 通常是在系统的CPU处理器上运行的线程。

Parent(父母):

父母线程,线程块或网格是已经启动新网格(即子网格)的网格线程。 直到其所有已启动的子网格都完成后,父级才被视为已完成。

Child(子):

子线程,块或网格是由父网格启动的线程,块或网格。 子线网格必须在父线程,线程块或网格被认为完成之前完成。

线程块范围:

带有线程块范围的对象具有单个线程块的生命周期。 它们只有在创建该对象的线程块中的线程操作时才具有已定义的行为,并且在创建它们的线程块完成时将被销毁。

设备运行时:

设备运行时指的是运行时系统和API,可以使内核函数使用动态并行。

CUDA学习(五十八)

继续阅读