CPU和GPU的区别

15

单个CPU处理单元和单个GPU处理单元之间有什么区别?
我在互联网上看到的大多数地方都涵盖了两者之间的高级差异。我想知道每个处理单元可以执行哪些指令,以及它们的速度如何,这些处理单元如何集成在完整的架构中?
这似乎是一个需要长篇回答的问题。所以提供多个链接也可以。

编辑:
在CPU中,FPU运行实数操作。每个GPU核心中相同的操作速度如何?如果速度快,为什么会快?
我知道我的问题很笼统,但我的目标是回答这些问题。


1
如果你想知道一个GPU可以执行哪些指令,你可以查看英特尔的GPU文档。他们为他们的GPU提供了非常详细的ISA参考。然而,GPU架构非常多样化,VLIW、SIMD和标量机器都被使用过。这只是英特尔的实现。 - user3528438
高级语言隐藏东西是一件令人沮丧的事情。但我认为,如果我了解GPU每个核心及其互连阵列的编程模型,它将回答我的问题。 - alphadog
2
架构差异高度依赖于具体的GPU / CPU。 (即使在同一类别中(一个CPU与另一个CPU),它们也有极大的区别,更不用说专门设计用于完全不同目的的组件了。)它们确实是“苹果”和“橙子”,都是水果,但在设计和目的上完全不同。 - Lilith Daemon
1
CPU和GPU之间有趣的差异在于FP乘法硬件以上的更高层次。据我所知,CPU中的单个FP乘法器逻辑块与GPU中的相同逻辑块并没有太大区别。真正的区别在于处理带有分支指令流的逻辑。据我所知(没有编程经验),GPU不适用于处理具有早期退出条件的并行算法(例如高质量视频编码,如x264)。请注意,GPU视频编码是在固定功能硬件上完成的,而不是在普通GPU执行单元上完成的。 - Peter Cordes
2
在我看来,这个问题并不适合在 Stack Overflow 上讨论。它可能有点棘手,但是了解硬件和软件之间的交互以便将问题最佳地映射到适当的体系结构中是很有价值的。虽然这个问题可能过于笼统,但是应该可以给出简明扼要的答案来解释 GPU 和 CPU 的主要区别。当然,解释每一个差异都是过于笼统的。我认为与缓存有关的以下问题与这个问题的范围相似:https://dev59.com/InNA5IYBdhLWcg3wfN2O。 - Gabriel Southern
显示剩余15条评论
3个回答

13

简短回答

GPU和CPU的主要区别在于,GPU设计用于并行执行同一操作的多个独立数据元素,而CPU设计用于尽可能快地执行单个指令流。

详细回答

问题的一部分询问了:

CPU中,FPU运行实数操作。每个GPU核心中相同操作的速度有多快?如果速度很快,那么为什么速度很快?

这涉及到CPU和GPU中使用的浮点(FP)执行单元。主要区别不是单个FP执行单元的实现方式。相反,区别在于CPU核心只有几个FP执行单元,这些单元处理独立指令,而GPU则有数百个FP执行单元,这些单元同时处理独立数据

GPU最初是为执行图形应用程序的计算而开发的。在这些应用程序中,同一操作会重复执行数百万次不同的数据点(想象一下应用于屏幕上每个像素的操作)。通过使用SIMDSIMT操作,GPU减少了处理单个指令的开销,但需要多个指令锁定步骤进行操作。

后来,GPGPU编程变得流行,因为除了图形之外,还有许多类型的编程问题适合这种模型。主要特点是问题是数据并行的,即同一操作可以独立地在许多不同的数据元素上执行。

与GPU不同,CPU被优化为尽可能快地执行单个指令流。CPU使用流水线、缓存、分支预测、乱序执行等技术来实现这一目标。在执行单个浮点运算的大部分晶体管和能量都花费在管理指令流通过管道的开销上,而不是浮点运算单元本身。虽然GPU和CPU的浮点运算单元可能略有不同,但这并不是两种体系结构之间的主要区别。主要区别在于如何处理指令流。CPU还倾向于在不同核之间具有缓存一致性内存,而GPU则没有。
当然,特定CPU和GPU的实现方式有许多变化。但高级编程的差异在于,GPU被优化用于数据并行工作负载,而CPU核心则被优化为尽可能快地执行单个指令流。

2
你的倒数第二段非常有信息量。我认为你应该突出其中的部分。 - alphadog

9
您的问题可能有各种答案和架构设计考虑。为了专注于您的问题,您需要更精确地定义“单个处理单元”的含义。
在NVIDIA GPU上,工作被安排成不可分离的“warp”,即一组CUDA“核”将在某些数据上执行相同的指令,潜在地不执行此指令 - warp大小为32项。这种warp的概念与具有SSE(2或4项)或AVX(4或8项)功能的CPU的SIMD指令非常相似。 AVX操作也将在一组值上操作,并且此向量单元的不同“lane”可能不同时执行不同的操作。
CUDA称为SIMT,因为CUDA“线程”比AVX“lane”具有更多灵活性。但是,在概念上类似。实质上,谓词的概念将指示是否应在某些CUDA“核心”上执行操作。 AVX提供掩码操作以提供类似的行为。从内存中读取和写入的方式也不同,因为GPU实现了汇集和分散,只有AVX2处理器才具有汇集和分散仅计划用于AVX-512。
考虑到这个类比的“单个处理单元”将意味着单个CUDA“核心”或单个AVX“lane”。在这种情况下,两者非常相似。实际上,两者都可以在一个周期内执行add、sub、mul、fma操作(吞吐量、延迟可能会有很大不同),以符合IEEE标准,在32位或64位精度下进行操作。请注意,双精度CUDA“核心”的数量将因游戏设备(即GeForce)而异,而不同的FPU类型的频率也会不同:离散GPU在1GHz范围内,而CPU更多地在2.x-3.xGHz范围内。
最后,GPU具有一个特殊功能单元,能够从标准数学库中计算一些超越函数的粗略近似值。这些函数中的一些也在AVX中实现了LRBNi和AVX-512,比精确对应项表现更好。IEEE标准对大多数功能不严格,因此允许不同的实现,但这更多是编译器/链接器的主题。

1
这是目前为止最好的答案。但是,相比AVX通道,CUDA“线程”有什么更灵活之处呢?对我来说,SIMT只是一个API/软件技巧的名称,在其中使用掩码来保持并等待每个通道中的操作完成。使用例如movmsk,多年来已经可以在SSE上实现。我可能需要就此提出一个问题。 - Z boson
1
非常好的观点。 "更灵活一些" 主要是指收集和散布(与内存交互)。自 CUDA 早期以来,GPU 就一直存在 Gather 和 Scatter。Gather 仅在 AVX2 中可用,而 Scatter 仅在即将推出的 AVX-512 中可用。因此,差异往往会逐渐消失。 - Florent DUGUET
1
我知道gather/scatter,但从未真正学会欣赏它,因为在x86上gather很糟糕。嗯,也许在Skylake上还可以,但在Broadwell和特别是Haswell上就不行了。直到现在我才真正意识到这一点,也许其中一个原因是GPU运行频率较低,这意味着更容易克服内存带宽,这可能意味着比高频CPU更容易实现有效的gather/scatter。 - Z boson
1
GPU的SM(流处理器)拥有加载和存储单元(专用硬件、内存提取缓冲区等),这些单元专门用于收集和散射操作(收集是图形纹理的一个很好的遗留物)。如果在编译时不知道数据是否对齐,或者难以确定数据是否对齐,那么在CPU上进行收集操作非常方便。当数据对齐时,收集操作的成本并不高,并且从编码角度来看,非常舒适。@Zboson,感谢您对这个话题的关注,并且喜欢这个比喻。 - Florent DUGUET

1
实质上,就串行代码而言,主要区别在于核心的时钟速度。GPU通常拥有数百个相对较慢的核心(现代GPU的核心速度通常为200-400 MHz),这使得它们非常不适合高度串行的应用程序,但允许它们以极高的效率执行高度细粒度和并发的应用程序(例如渲染)。
然而,CPU设计用于执行高度串行的应用程序,几乎没有多线程。现代CPU通常具有2-8个核心,时钟速度超过3-4 GHz。
通常,高度优化的系统将利用两种资源,使用GPU进行高度并发的任务,使用CPU进行高度串行的任务。
还有其他几个区别,如实际指令集、缓存处理等,但这些超出了本问题的范围。(甚至更偏题了)

我在想要在哪里获取更多的见解?我已经在StackExchange的理论计算机科学社区发布过了。 - alphadog
说实话,我不知道该给你指路。Stack Exchange网络并不是每个问题的正确去处,尤其是像这样广泛的问题。 - Lilith Daemon
我想我得花好几个小时自己翻阅冗长的手册。我只是想,有人曾经使用过这两种架构,可以给我一个真正的洞见。 - alphadog
@new-kid 说实话,考虑到你所需要的深度,手册可能是最好的选择。 - Lilith Daemon
今天销售的大多数GPU时钟速度比400 MHz高得多。 高端GPU的更典型时钟速度为1.2 GHz。 因此,虽然GPU的时钟速度比CPU慢,但这不是它们执行单个指令流较慢的主要原因。 还有其他架构差异是主要原因,但解释它们太多了,无法在评论中放入。 但我确实想强调的是,尽管时钟速度确实有所不同,但这不是GPU对于串行代码比CPU更慢的主要原因。 - Gabriel Southern
显示剩余2条评论

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