CPU 和 GPU 差异

CPU and GPU differences

CPU单处理单元和GPU单处理单元有什么区别?
我在互联网上遇到的大多数地方都涵盖了两者之间的高层次差异。我想知道每条指令可以执行什么指令,它们的速度有多快,以及这些处理单元如何集成到竞争架构中?
这似乎是一个答案很长的问题。所以很多链接都很好。

编辑:
在CPU中,FPU运行实数运算。每个 GPU 核心执行相同操作的速度有多快?如果快那么为什么快?
我知道我的问题很笼统,但我的目标是让这些问题得到解答。

本质上,就串行向 运行 编写代码而言,主要区别在于内核的时钟速度。 GPU 通常有数百个相当慢的内核(现代 GPU 通常具有速度为 200-400 MHz 的内核)这使得它们在高度串行应用程序中非常糟糕,但允许它们以出色的性能执行高度颗粒化和并发的应用程序(例如渲染)处理效率。

然而,

A CPU 旨在执行高度串行的应用程序,很少或没有多线程。现代 CPU 通常有 2-8 个内核,时钟速度超过 3-4 Ghz。

通常,高度优化的系统会利用这两种资源,将 GPU 用于高度并发的任务,并将 CPUs 用于高度串行的任务。

还有其他一些差异,例如实际指令集、缓存处理等,但这些不在本问题的讨论范围内。 (还有更多关于 SO 的题外话)

简答

GPU 和 CPUs 之间的主要区别在于,GPU 旨在对许多独立数据元素并行执行相同的操作,而 CPUs 旨在执行单个数据流尽快说明。

详细解答

部分问题问

In the CPU, the FPU runs real number operations. How fast are the same operations being done in each GPU core? If fast then why is it fast?

这是指在 CPU 和 GPU 中使用的浮点 (FP) 执行单元。 主要区别而非单个 FP 执行单元的实现方式。相反,不同之处在于 CPU 核心将只有几个 FP 执行单元在 独立指令 上运行,而 GPU 将有数百个在 [=31] 上运行=]并行独立数据。

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

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

与 GPU 相比,CPUs 经过优化以尽快执行单个指令流。 CPUs使用流水线、缓存、分支预测、乱序执行等手段来达到这个目的。执行单个浮点指令所花费的大部分晶体管和能量都花在管理流水线中的指令流的开销上,而不是花在 FP 执行单元上。虽然 GPU 和 CPU 的 FP 单元可能会有所不同,但这不是两种架构之间的主要区别。主要区别在于指令流的处理方式。 CPUs 也倾向于在不同的内核之间具有缓存一致性内存,而 GPU 则没有。

当然,具体 CPU 和 GPU 的实现方式有很多变化。但高级编程的不同之处在于,GPU 针对数据并行工作负载进行了优化,而 CPUs 内核针对尽快执行单个指令流进行了优化。

您的问题可能会打开各种答案和体系结构设计注意事项。试图严格关注您的问题,您需要更准确地定义 "single processing unit" 的含义。

在 NVIDIA GPU 上,您将工作安排在不可分离的 warp 中,即一组 CUDA "cores" 将对某些数据执行相同的指令,可能不执行此指令 - warp 大小为32 个条目。这种 warp 的概念与具有 SSE(2 或 4 个条目)或 AVX(4 或 8 个条目)功能的 CPU 的 SIMD 指令非常相似。 AVX操作也会对一组值进行操作,不同的"lanes"这个向量单元不能同时做不同的操作

CUDA 称为 SIMT,因为 CUDA "threads" 比 AVX "lanes" 更灵活。但是,它在概念上是相似的。本质上,谓词的概念将指示操作是否应该在某些 CUDA "core" 上执行。 AVX 在其通道上提供屏蔽操作以提供类似的行为。读取和写入内存也是不同的,因为 GPU 实现了收集和分散,其中只有 AVX2 处理器收集和分散是专门为 AVX-512 安排的。

用这个类比来考虑 "single processing unit" 将意味着单个 CUDA "core",或者例如单个 AVX "lane"。在那种情况下,两者非常相似。实际上,两者都在一个周期内以符合 IEEE 规范的方式以 32 位或 64 位精度操作 add、sub、mul、fma(尽管吞吐量、延迟可能会有很大差异)。请注意,双精度 CUDA "cores" 的数量因游戏设备 (a.k.a.GeForce) 和 Tesla 解决方案而异。此外,每种 FPU 类型的频率不同:离散 GPU 在 1GHz 范围内导航,而 CPU 在 2.x-3.xGHz 范围内。

最后,GPU 有一个特殊函数单元,它能够计算标准数学库中某些超越函数的粗略近似值。这些函数,其中一些也在 AVX、LRBNi 和 AVX-512 中实现,比精确的对应函数执行得更好。 IEEE 规范对大多数功能并不严格,因此允许不同的实现,但这更像是一个 compiler/linker 主题。