NVIDIA GPU的任务调度

5

我对nvidia GPU的任务调度有些疑问。

(1) 如果一个block(CTA)中的线程warp已经完成了,但是还有其他warp在运行,那么这个warp会等待其他warp完成吗?换句话说,当所有线程都完成时,块(CTA)中的所有线程都释放资源,这样行得通吗?我认为这一点应该是正确的,因为块中的线程共享共享内存和其他资源,这些资源分配在一个CTA size manager中。

(2) 如果一个block(CTA)中的所有线程都因为一些长延迟(如全局内存访问)而挂起,新的CTA线程是否会占用像CPU一样的资源?换句话说,如果一个block(CTA)已经被分派到一个SM(Streaming Processors),它是否会一直占用资源直到完成?

如果有人能向我推荐一些关于GPU架构的书籍或文章,我将不胜感激。谢谢!

2个回答

8
计算工作分配器只会在SM具有足够的资源(共享内存,warp,寄存器,屏障等)时才会在SM上调度线程块(CTA)。线程块级别的资源,如共享内存,将被分配。分配将为线程块中的所有线程创建足够的warp。资源管理器将warp轮流分配给SM子分区。每个SM子分区都包含一个warp调度器、寄存器文件和执行单元。一旦将warp分配给子分区,它将保留在该子分区直到完成或被上下文切换抢占(Pascal架构)。在上下文切换恢复时,warp将恢复到相同的SM相同的warp-id。
当warp中的所有线程都完成时,warp调度器等待由warp发出的所有未完成指令完成,然后资源管理器释放warp级别的资源,其中包括warp-id和寄存器文件。
当线程块中的所有warp都完成时,将释放块级别资源,并且SM将通知计算工作分配器块已完成。
一旦将warp分配给子分区并分配所有资源,该warp被认为是活动状态,这意味着warp调度器正在积极跟踪warp的状态。在每个周期中,warp调度器确定哪些活动warp被阻塞,哪些warp有资格发出指令。warp调度器选择优先级最高的有资格warp并从warp中发出1-2个连续指令。双重发行的规则对每个架构都是特定的。如果warp发出内存加载,则它可以继续执行独立指令,直到达到依赖指令。然后,warp将报告阻塞,直到加载完成。依赖数学指令也是如此。SM架构旨在通过在warp之间每个周期切换来隐藏ALU和内存延迟。
此答案不使用CUDA核心一词,因为这会引入不正确的思维模型。 CUDA核心是流水线单精度浮点/整数执行单元。发行速率和依赖性延迟对每个架构都是特定的。每个SM子分区和SM还具有其他执行单元,包括加载/存储单元、双精度浮点单元、半精度浮点单元、分支单元等。

3
我建议阅读这篇文章。虽然有点过时,但我认为这是一个很好的起点。该文章针对 Kepler 架构,所以最新的 Pascal 架构可能会有一些行为上的差异。
针对您的具体问题(基于该文章): Q1. 一个 block 中的线程是否只有在所有线程都运行完后才释放其资源? 是的。一个 warp 在其他同一 block 的 warps 还未完成时完成了运行,它仍会占用其资源,如寄存器和共享内存。 Q2. 当一个 block 中的所有线程都挂起时,它是否仍会占用资源?或者说,新的线程块是否接管资源? 您正在询问是否可以抢占一个 block。我已经搜索了网站,并从这里得到了答案。

在计算能力小于3.2的设备上,块永远不会被抢占。 在计算能力3.2+的设备上,只有在设备端内核启动(动态并行)或单GPU调试期间,块才会被抢占。

因此,当某些全局内存访问导致warp停滞时,块不会放弃其资源。您应该设计您的CUDA代码,使得大量的warp驻留在SM中等待分派。在这种情况下,即使某些warp正在等待全局内存访问完成,调度程序也可以启动其他线程,从而有效地隐藏延迟。


是的,在SM中可以同时运行多个块。但是,当一个块(在SM上的多个并发块之一)的所有线程都挂起时,它是否仍然占用资源? - foxspy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接