GPU中的上下文切换机制是什么?

23

据我所知,GPU在切换线程束(warp)以隐藏内存延迟。但我想知道,在什么条件下线程束会被切换出来?例如,如果一个线程束执行了一次加载操作,而数据已经在缓存中了,那么这个线程束会被切换出还是继续执行下一步计算?如果有两个连续的加法操作会发生什么呢?

1个回答

34

首先,一旦一个线程块在一个多处理器(SM)上启动,所有它的warp都会停留直到它们全部退出kernel。因此,在启动一个块之前,需要有足够数量的寄存器供所有warp使用,并且需要有足够的空闲共享内存供整个块使用。

所以,warp从来不会被“切换出去”-传统意义上的warp间上下文切换是不存在的,其中上下文切换需要将寄存器保存到内存中并还原它们。

然而,SM会从所有驻留的warp中选择要发出的指令。事实上,SM更可能连续从不同warp中发出两条指令,而不是从同一个warp中发出,无论指令类型如何,无论存在多少ILP(指令级并行性)。不这样做会使SM面临依赖关系暂停。即使像加法这样的“快速”指令也具有非零延迟,因为算术管道需要多个周期。例如,在Fermi上,硬件可以每个周期发出2个或更多warp指令(峰值),并且算术管道延迟约为12个周期。因此,您需要多个warp处于运行状态,才能隐藏算术延迟,而不仅仅是内存延迟。

总的来说,warp调度的细节取决于架构,不公开文档化,并且几乎肯定会随着时间的推移而发生变化。CUDA编程模型与调度算法无关,您不应该在软件中依赖它。


4
不要考虑“切换”,而要考虑“发出”。SM具有一组常驻的warp,可以从中发出指令。在任何给定周期内它发出哪个warp是无关紧要的,只要它始终在发出指令即可。 - harrism
2
不要把它看作是切换,而是发出指令。SM有一个常驻warp池,可以从中发出指令。在任何给定的周期内,它发出的warp并不重要,重要的是它总是有可以发出的指令。一个SM是否可能连续两次从同一个warp发出指令,这是否会影响您如何编写CUDA程序?不会。 - harrism
谢谢您的解释,harrism。我认为它很准确。CUDA手册应该有更多的细节。优化程序将会更好。 - Zk1001
1
Damon,让我解释一下我的理解。我认为基本上这些想法根本不是相互对立的。切换一个warp只是意味着SM不会执行该warp的下一条指令,并且该warp被阻塞,直到属于它的所有线程完成当前指令。在切换出warp的时候,我认为由于指令流水线,它的一些线程仍然可以占用一些执行单元。他们所说的切换进和出实际上只是指一个warp的指令是否已经开始以lockstep方式执行。 - Zk1001
4
"in flight" 意味着驻留在 SM 上。只要它们驻留,它们就不会被“切换”——它们的寄存器集、共享内存、程序计数器等都得到维护。 "切换" 只是从驻留线程集中选择要发出的指令。 我试图防止与传统 CPU 线程上下文“切换”混淆,因为要在执行线程之间进行切换需要将分配的寄存器值、程序计数器等保存并恢复到芯片外部存储器(或高速缓存),因此这是一种更加繁重的操作。 - harrism
显示剩余5条评论

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