硬件扭曲调度程序如何形成和处理扭曲?

Bla*_*air 2 cuda gpu scheduling

我的问题是关于扭曲和调度。我在这里使用 NVIDIA Fermi 术语。我的观察如下,它们正确吗?

A. 同一经线中的线程执行相同的指令。每个经线包括 32 根线。

根据 Fermi 白皮书:“Fermi 的双扭曲调度器选择两个扭曲,并从每个扭曲向一组十六个内核、十六个加载/存储单元或四个 SFU 发出一条指令。”

从这里开始,我认为一个经线(32 个线程)被安排了两次,因为 32 个核心中有 16 个被组合在一起。每个调度器在一个周期内向 16 个内核发出一半的扭曲,总的来说,两个调度器在一个周期内将两个扭曲的一半发布到两个 16 核的调度组中。换句话说,在这种费米架构中,一个经线需要安排两次,一半一半。如果一个 warp 只包含 SFU 操作,那么这个 warp 需要发出 8 次(32/4),因为一个 SM 中只有 4 个 SFPU。

B.当大量线程(比如一维数组,320个线程)启动时,连续的线程会自动分成10个warp,每个warp有32个线程。因此,如果所有线程都在做相同的工作,它们将执行完全相同的指令。在这种情况下,所有经线总是携带相同的指令。

问题:Q1。哪个部分处理线程分组(进入经线)?软件还是硬件?如果是硬件,它是经线调度程序吗?以及硬件扭曲调度程序是如何实现和工作的?

Q2。如果我有 64 个线程,线程 0-15 和 32-47 正在执行相同的指令,而 16-31 和 48-63 执行另一条指令,调度程序是否足够聪明以将非连续线程(具有相同指令)分组到同一个扭曲中(即,将线程 0-15 和 32-47 分组到同一经纱中,并将线程 16-31 和 48-63 分组到另一个经纱中)?

Q3。将扭曲大小(32)大于调度组大小(16 核)有什么意义?(这是一个硬件问题)因为在这种情况下(费米),无论如何都会调度两次扭曲(在两个周期内)。如果一个warp 是16 宽,那么只会安排两个warp(也是在两个周期内),这似乎与前面的情况相同。我想知道这个组织是否是由于性能问题。

我现在可以想象的是:可以保证同一 warp 中的线程同步,这有时很有用,或者其他资源(例如寄存器和内存)按 warp 大小组织。我不确定这是否正确。

Rob*_*lla 5

纠正一些误解:

A. ...从这里开始,我认为一个经线(32 个线程)被安排了两次,因为 32 个内核中有 16 个被组合在一起。

当向一组 16 个内核发出 warp 指令时,整个 warp 都会执行该指令,因为内核有两次时钟(费米的“热时钟”),因此每个内核实际上在一个周期内执行了两个线程的计算(= 2热时钟)。当发送一条扭曲指令时,整个扭曲都会得到服务。它不需要被安排两次。

B. ...因此,如果所有线程都在做相同的工作,它们将执行完全相同的指令。在这种情况下,所有经线总是携带相同的指令。

确实,块中的所有线程(因此所有扭曲)都从相同的指令流执行,但它们不一定执行相同的指令。当然,warp 中的所有线程在任何给定时间都在执行相同的指令。但是扭曲彼此独立执行,因此块内的不同扭曲可能在​​任何给定时间执行来自流的不同指令。费米白皮书第 10 页的图表清楚地表明了这一点。

Q1:哪个部分处理线程分组(成经线)?软件还是硬件?

它是由硬件完成的,如编程指南的硬件实现部分所述:“将块划分为 warp 的方式总是相同的;每个 warp 包含连续的线程,增加线程 ID,第一个 warp 包含线程 0。线程层次结构描述了线程 ID 如何与块中的线程索引相关联。”

以及硬件扭曲调度程序是如何实现和工作的?

我不相信这在任何地方都有正式记录。Greg Smith 对此提供了各种解释,您可能希望搜索“user:124092 scheduler”或类似的搜索,阅读他的一些评论。

Q2。如果我有 64 个线程,线程 0-15 和 32-47 正在执行相同的指令,而 16-31 和 48-63 执行另一条指令,调度程序是否足够聪明以将非连续线程(具有相同指令)分组到同一个扭曲中(即,将线程 0-15 和 32-47 分组到同一经纱中,并将线程 16-31 和 48-63 分组到另一个经纱中)?

这个问题是基于之前概述的误解。将线程分组到一个 warp 中不是动态的;它在线程块启动时固定,并遵循上述 Q1 的答案中描述的方法。此外,线程 0-15 永远不会与除 16-31 之外的任何线程一起调度,因为 0-31 包含一个扭曲,为了调度目的,它在 Fermi 上是不可分割的。

Q3。使扭曲大小(32)大于调度组大小(16 核)有什么意义?

同样,我相信这个问题是基于以前的误解。用于为warp提供资源的硬件单元在某些功能级别可能存在16个单元(或其他数量),但从操作级别来看,warp被调度为32个线程,并且每个指令被调度为整个warp,并在一定数量的费米热时钟内一起执行。