每个SM执行的CUDA线程数量的澄清

4
我是新手CUDA编程,正在阅读一本名为“Programming Massively Parallel Processors - A hands on approach”的书籍,其中提到了一个具有128个SPs(每个SM都有8个SPs,总共16个SMs)的G80芯片。该书对Intel CPU和G80芯片进行了比较。 Intel CPU每个核心支持2到4个线程,具体取决于机器型号。 而G80芯片每个SM支持768个线程,因此该芯片总共支持12000个线程。
我的问题是,G80芯片是否可以同时执行768个线程? 如果不是同时执行,那么Intel CPU支持每个核心2到4个线程是什么意思?我们总是可以在Intel CPU上运行许多线程/进程,并由操作系统进行调度。

1
这个答案可能会有所帮助:https://dev59.com/RGw15IYBdhLWcg3wntOh - harrism
3个回答

5
G80同时为每个SM保留768个线程的上下文,并交错它们的执行。这是CPU和GPU之间的关键区别。GPU是一种深度多线程处理器,通过计算隐藏某些线程的内存访问,使其不受其他线程的影响。执行一个线程的延迟比CPU高得多,而GPU针对线程吞吐量进行了优化,而不是线程延迟。相比之下,CPU使用乱序推测执行来减少一个线程的执行延迟。GPU使用了几种技术来减少线程调度开销。例如,GPU将线程分组在更粗糙的可调度元素中,称为warp或wavefront,并在SIMD上执行warp的线程。GPU线程是相同的,使它们成为SIMD模型的合适选择。从程序员的角度来看,线程以MIMD方式执行,并将它们分组在线程块中以减少通信开销。
CPU核心中使用的线程用于通过动态调度填充不同的执行单元。CPU线程不一定是相同类型的。这意味着一旦一个线程忙于浮点运算,其他线程可能会发现ALU是空闲的。因此,可以同时执行这些线程。为了有效地填充不同的执行单元并防止空闲单位,每个核心维护多个线程。然而,动态调度在功耗和能量消耗方面是昂贵的。因此,制造商每个CPU核心使用了少量线程。
回答你问题的第二部分:GPU中的线程由硬件(每个SM warp调度程序)调度,操作系统甚至驱动程序都不会影响调度。

2
到目前为止,这是最好的答案,但还有一些缺点。您应该提到GPU线程(和CPU超线程)没有昂贵的上下文切换,因为所有驻留线程的资源(寄存器数据)同时驻留在芯片上。此外,您的声明“执行线程的延迟比CPU高得多”是具有误导性的。您的意思是,由于更大/更深的缓存、乱序执行、分支预测等,某些CPU指令具有较低的延迟。 - harrism
@harrism:你的评论很好地补充了答案。 - lashgar

1
据我所知,每个SM中常驻线程的最大数量为768。这些线程以32个线程为一组执行。因此,在一个SM中,所有768个线程不会同时执行,而是按照32个线程一组的方式进行调度,即一次一个warp。

1
在CPU上类似的技术被称为“同时多线程”(SMT),或者是英特尔营销术语中的超线程。它通常允许CPU硬件自身调度两个线程,在某些CPU上可以调度四个线程。
这与操作系统可能在软件层面上调度更多线程的事实不同。

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