CPU和GPU差异

时间:2016-04-17 20:34:46

标签: gpu cpu cpu-architecture

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

编辑:
在CPU中,FPU运行实数操作。在每个GPU核心中执行相同操作的速度有多快?如果快,那为什么它快?
我知道我的问题非常通用,但我的目标是回答这些问题。

3 个答案:

答案 0 :(得分:10)

简短回答

GPU与CPU之间的主要区别在于GPU设计为在许多独立数据元素上并行执行相同的操作,而CPU则设计为尽可能快地执行单个指令流。

详细答案

部分问题是

  

在CPU中,FPU运行实数操作。速度有多快   在每个GPU核心中完成操作?如果快,为什么它快?

这是指CPU和GPU中使用的浮点(FP)执行单元。 主要差异如何实施单个FP执行单元。相反,不同之处在于CPU核心只有少数FP执行单元可以在独立指令上运行,而GPU将有数百个在独立数据上运行平行。

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

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

与GPU相比,CPU经过优化,可以尽快执行单个指令流。 CPU使用流水线操作,缓存,分支预测,无序执行等来实现此目标。执行单个浮点指令所花费的大多数晶体管和能量用于管理通过流水线而不是FP执行单元中的指令流的开销。虽然GPU和CPU的FP单元可能会有所不同,但这并不是两种架构之间的主要区别。主要区别在于如何处理指令流。 CPU也往往在不同的内核之间具有高速缓存一致性内存,而GPU则不然。

当然,特定CPU和GPU的实现方式有很多变化。但是,高级编程差异在于GPU针对数据并行工作负载进行了优化,而CPU核心则针对尽可能快地执行单个指令流进行了优化。

答案 1 :(得分:6)

您的问题可能会打开各种答案和架构设计注意事项。试图严格关注您的问题,您需要更准确地定义“单个处理单元”的含义。

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

CUDA被称为SIMT,因为在CUDA“线程”上比在AVX“通道”上有更多的灵活性。但是,它在概念上是类似的。本质上,谓词的概念将指示是否应该对某些CUDA“核心”执行操作。 AVX在其通道上提供屏蔽操作以提供类似的行为。读取和写入内存也是不同的,因为GPU实现了收集和分散,只有AVX2处理器才能收集和分散,而且仅为AVX-512安排分散。

考虑到具有这种类比的“单个处理单元”将意味着单个CUDA“核心”或例如单个AVX“通道”。在这种情况下,两者非常相似。实际上,两者在单个周期中操作add,sub,mul,fma(吞吐量,延迟可能会有很大变化),符合IEEE标准,32位或64位精度。请注意,双精度CUDA“核心”的数量将从游戏玩家设备(a.k.a.GeForce)到特斯拉解决方案不等。此外,每种FPU类型的频率都不同:独立GPU在1GHz范围内导航,其中CPU处于2.x-3.xGHz范围内。

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

答案 2 :(得分:1)

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

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

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

还有其他一些差异,例如实际指令集,缓存处理等,但这些差异超出了这个问题的范围。 (甚至更多关于SO的主题)