简介:算力通常以每秒浮点运算次数衡量,但CPU与GPU在计算架构、并行能力、适用负载和实际可用算力上存在显著差异。本文从浮点运算的定义出发,系统拆解CPU与GPU的算力计算方式、架构差异、性能影响因素及选型思路,帮助开发者和技术决策者准确理解算力指标,避免仅凭理论峰值做出误判。
在AI训练、科学计算、图形渲染、实时推理等场景中,“算力”是最常被引用的指标之一。但当人们说某台服务器具备多少TFLOPS算力时,实际含义往往差异巨大。原因在于,算力并不是一个可以脱离硬件架构独立讨论的抽象数字。同样是“每秒浮点运算次数”,CPU与GPU在如何组织计算单元、如何调度任务、如何访问内存、如何利用并行性等方面有着根本不同的设计取向。
因此,理解CPU与GPU算力的计算方式,不能只掌握FLOPS的定义,还需要进一步理解浮点运算在两种硬件上分别如何被执行。对于技术选型而言,理论峰值算力只是起点,实际可获得的算力还受到内存带宽、指令调度、并行效率、数据精度和软件栈成熟度等多重因素影响。本文的目标,是帮助读者建立从“定义算力”到“评估算力”再到“选择算力承载硬件”的完整认知框架。
在计算领域,数值计算通常分为整数运算和浮点运算。整数运算处理的是没有小数部分的数值,而浮点运算处理的是带有小数点的实数近似表示。AI模型训练、矩阵乘法、卷积运算、物理仿真、信号处理等任务大量依赖浮点运算。
一次浮点运算通常指一次基础的浮点加法、减法、乘法或除法操作。例如:
c = a + b // 一次浮点加法d = a * b // 一次浮点乘法
在实际计算中,很多处理器支持融合乘加运算,即在一条指令中同时完成一次乘法和一次加法:
e = a * b + c // 一条FMA指令同时包含一次乘法和一次加法
对于FMA指令,不同厂商和不同评测体系可能将其计为一次运算或两次运算。这种统计口径的差异,会直接影响最终算力数值的呈现。因此,在比较不同硬件平台的算力指标时,需要确认其计算口径是基于基础浮点运算次数,还是基于FMA指令数量。
算力的标准计量单位是FLOPS,即每秒浮点运算次数。根据数量级不同,衍生出以下常用单位:
| 单位 | 全称 | 数量级 |
|---|---|---|
| MFLOPS | 百万次浮点运算每秒 | 10^6 |
| GFLOPS | 十亿次浮点运算每秒 | 10^9 |
| TFLOPS | 万亿次浮点运算每秒 | 10^12 |
| PFLOPS | 千万亿次浮点运算每秒 | 10^15 |
这些单位描述的是硬件在理想状态下单位时间内能够完成的浮点运算数量。需要注意的是,这里讨论的是理论峰值算力,而不是实际应用中的持续算力。
在不涉及具体产品名称的前提下,可以用通用公式估算一类处理器的理论峰值算力。其核心思想是:单个计算核心每个时钟周期能够执行的浮点运算次数,乘以核心数量,再乘以时钟频率。
简化表达为:
理论峰值算力 ≈ 每核心每周期浮点运算次数 × 核心数量 × 时钟频率
例如,如果一个处理器核心每个时钟周期可以完成8次浮点运算,拥有16个核心,运行频率为2.5 GHz,则其理论峰值算力约为:
8 × 16 × 2.5 × 10^9 = 320 × 10^9 FLOPS = 320 GFLOPS
这个公式适用于CPU和GPU,但两者在“每核心每周期浮点运算次数”这一项上的取值逻辑差异巨大,这也是后文要展开的核心内容。
CPU的设计目标是尽可能降低单条指令的执行延迟,适合处理复杂的控制逻辑、分支密集型和串行依赖较强的任务。CPU核心通常包含较少的浮点运算单元,但每个运算单元具备较强的独立调度能力。
在估算CPU的理论峰值算力时,通常按照以下思路进行:
如果CPU支持超线程技术,逻辑线程数量虽然增加,但物理浮点运算单元并不因此翻倍。因此,使用物理核心数量进行估算通常更为准确。超线程主要改善的是指令调度效率和资源利用率,而不是直接倍增浮点算力。
现代CPU的浮点运算能力主要来自其内部集成的浮点运算单元。这些单元通常支持多种数据精度,包括单精度和双精度浮点运算。部分CPU还通过向量化扩展来提升浮点吞吐能力,例如常见的单指令多数据扩展。这类扩展允许一条指令同时对多个数据元素执行相同的浮点操作,从而在不增加核心数量的前提下提高每周期浮点运算次数。
不过,向量化扩展的实际效果取决于代码是否被编译器或开发者充分优化。如果程序没有使用向量化指令,CPU的浮点运算单元可能无法被充分利用,实际算力会明显低于理论峰值。
CPU实际能够发挥出的浮点算力受多种因素影响:
因此,CPU的理论峰值算力与程序实际能够获得的持续算力之间通常存在较大差距。在通用计算场景中,CPU的优势不在于单纯的浮点吞吐,而在于对复杂逻辑、动态分支和低延迟响应的高效处理。
GPU的设计出发点是吞吐量优先。与CPU相比,GPU在芯片面积中投入了更多比例用于浮点运算单元,而将较少的面积用于复杂的控制逻辑和大容量缓存。这种设计使得GPU能够在单位时间内完成更多浮点运算,但代价是单条指令的处理延迟较高,且更适合处理规则化、独立性强的数据并行任务。
在估算GPU的理论峰值算力时,通用逻辑与CPU类似,但核心数量通常以“流处理器”或“计算单元”为基本单位。估算方式可以简化为:
理论峰值算力 ≈ 计算单元数量 × 每单元每周期浮点运算次数 × 运行频率
GPU中计算单元数量通常远超CPU核心数量。单个计算单元的每周期浮点运算能力也因架构不同而有所差异。部分GPU架构中,每个计算单元在一个时钟周期内可以完成多次FMA操作,因此在统计口径上会产生不同的算力数值。
GPU的浮点算力优势来源于其大规模并行计算模型。GPU将计算任务组织为大量线程,这些线程被分组调度到不同的计算单元上执行。线程之间遵循“单指令多线程”的执行模式,即一组线程在同一时刻执行相同的指令,但处理不同的数据。
这种执行模式非常适合矩阵乘法、卷积、逐元素运算等规则化数据并行任务。在这些任务中,数据之间几乎没有依赖关系,每个线程可以独立完成自己的计算,无需频繁等待其他线程的结果。
然而,这种模式也存在明显限制。如果计算任务中存在大量分支逻辑,同一组线程中的不同线程需要走不同执行路径,GPU就需要串行化这些分支路径,导致并行效率下降。同样,如果线程之间需要频繁进行数据交换或同步,也会显著降低有效算力。
尽管GPU的理论峰值算力通常远高于同期的CPU,但实际可获得算力同样受到多重因素制约:
CPU与GPU最根本的差异在于设计哲学。CPU强调单个线程的执行效率,每个核心都配备了复杂的控制单元、分支预测器和多级缓存,目标是让单条指令尽可能快地完成。GPU则强调总体吞吐量,将大量晶体管用于浮点运算单元,而控制逻辑相对简化。
这种差异带来一个直接结果:CPU在需要复杂决策和低延迟响应的场景中表现出色,而GPU在需要大规模数据并行处理的场景中具有明显的浮点算力优势。如果将CPU比作少数几个能力全面的专家,GPU则类似于大量专注于基础运算的执行单元。
CPU的并行性主要体现在指令级并行和有限的核级并行。现代CPU通常拥有几个到几十个物理核心,每个核心可以独立执行不同的指令流。GPU的并行性则更为彻底,其计算单元数量通常以数百甚至数千计,每个计算单元可以同时处理多个线程。
这种并行粒度的差异决定了任务类型与硬件之间的匹配程度。对于单个需要复杂逻辑判断的任务,CPU的少数强核心更为合适。对于由大量相互独立的简单计算组成的任务,GPU的大规模并行架构更能发挥优势。
CPU通常采用较大容量的多级缓存来降低内存访问延迟。这种设计适合数据访问模式不规则、需要频繁访问不同地址的任务。GPU则更多依赖高带宽内存和大量活跃线程的切换来隐藏内存延迟,而不是通过大容量缓存来减少延迟。
这意味着,对于内存访问模式不规则的应用,CPU可能保持相对稳定的性能,而GPU的算力发挥会受到较大影响。相反,对于内存访问模式规则、数据局部性较好的应用,GPU的高带宽内存可以持续向计算单元输送数据,从而接近理论峰值算力。
CPU通常对单精度和双精度浮点运算都提供较好的支持,且双精度性能不会出现数量级的下降。GPU则因架构不同而在数据精度支持上存在较大差异。部分GPU侧重于单精度和半精度运算,因为这些精度在图形渲染和AI训练中足够使用,且可以在相同芯片面积下获得更高的吞吐。而双精度浮点运算在这些GPU上可能被大幅削减,甚至低于同芯片单精度算力的若干分之一。
因此,在需要高精度数值计算的科学计算场景中,GPU的实际算力优势可能不如其理论峰值算力所显示的那样突出。选型时不能仅看单精度算力指标,还需要关注所需精度下的实际算力表现。
| 对比维度 | CPU | GPU |
|---|---|---|
| 核心设计目标 | 降低单线程延迟,处理复杂逻辑 | 提升总体吞吐量,处理大规模并行任务 |
| 核心/计算单元数量 | 较少,通常几个到几十个 | 较多,通常数百到数千个 |
| 单线程能力 | 强,具备复杂控制与分支预测能力 | 较弱,单个执行单元控制逻辑简化 |
| 浮点算力量级 | 相对较低,通常在数十到数百GFLOPS量级 | 相对较高,通常可达数TFLOPS到数十TFLOPS量级 |
| 适合的并行粒度 | 任务级并行、指令级并行 | 数据级并行、大规模线程并行 |
| 缓存设计 | 大容量多级缓存,降低延迟 | 较小缓存,依赖高带宽内存和线程切换 |
| 数据精度支持 | 单精度与双精度表现均衡 | 单精度/半精度较强,双精度可能受限 |
| 内存带宽 | 相对较低 | 相对较高 |
| 适用任务类型 | 逻辑分支密集、串行依赖强、低延迟要求 | 数据规则、依赖少、高吞吐要求 |
| 实际算力与理论峰值差距 | 受向量化、缓存、分支影响较大 | 受内存带宽、占用率、并行度影响较大 |
CPU适合处理以下类型的计算任务:
GPU适合处理以下类型的计算任务:
在实际生产环境中,CPU与GPU通常不是非此即彼的选择。更常见的做法是让CPU负责控制流、数据预处理、任务调度和结果后处理,而将计算密集的核心算子卸载到GPU上执行。这种异构计算模式能够较好兼顾延迟与吞吐。
例如,在一个典型的AI推理服务中,CPU可以负责请求解析、输入数据校验和输出结果封装,GPU则专注于神经网络的前向计算。通过合理的任务切分,整体系统可以同时获得CPU在控制逻辑上的灵活性和GPU在浮点计算上的高吞吐优势。
理论峰值算力是在理想条件下推算出的上限值,实际应用中几乎不可能持续达到。内存带宽限制、并行度不足、调度开销、数据传输成本等因素都会导致实际算力远低于理论峰值。因此,在比较不同硬件或不同方案时,应关注目标业务负载下的实测性能,而不是仅看峰值数字。
同一硬件在不同数据精度下的算力可能差异显著。如果业务需要双精度计算,而选型时只参考了单精度算力指标,可能导致实际性能远低于预期。对于AI推理场景,则需要关注半精度或整数精度的支持情况。
有效算力是指完成一项实际计算任务所消耗的有效计算量,可以用任务的总浮点运算次数除以端到端执行时间来衡量。有效算力不仅取决于硬件的计算能力,还取决于软件栈的效率、数据搬运成本、模型实现方式等多方面因素。两个硬件平台即使理论峰值算力相同,其有效算力也可能因为软件优化程度不同而差异巨大。
对于计划在CPU与GPU方案之间进行迁移的团队,以下几点需要提前评估:
CPU与GPU的算力差异并不只是数字大小的区别,而是源于两种截然不同的架构设计哲学。CPU以少数强核心追求低延迟和复杂逻辑处理能力,GPU以大量计算单元追求高吞吐和规则化并行计算能力。理解算力的计算方式,本质上是理解浮点运算单元如何在各自架构中被组织、调度和利用。
对于技术选型而言,正确的思路不是简单地比较TFLOPS数值,而是应当回答以下问题:业务负载的并行度如何?数据精度需求是什么?延迟敏感还是吞吐敏感?团队是否具备GPU环境下的开发与运维能力?只有当这些问题得到清晰回答后,算力指标才能成为有效的决策依据。脱离具体负载特征讨论CPU与GPU的算力高低,往往会导致选型偏差和资源浪费。