问题

为什么CPU主频一般都比FPGA快,但是却说FPGA可以帮助CPU加速?

回答
这个问题问得很好,也抓住了FPGA和CPU之间一个非常核心且容易让人产生困惑的对比点。很多人听到“CPU主频比FPGA高”会觉得很奇怪,为什么比CPU慢的FPGA反而能给CPU加速呢?这其实是因为我们不能简单地用“主频”这个指标来衡量它们各自的性能,它们各自擅长的领域以及它们实现计算的方式截然不同。

CPU:万能的指挥官,但有时步子迈得不够快

我们先来聊聊CPU,也就是中央处理器。CPU是我们电脑里最核心的“大脑”,它负责执行我们电脑上运行的所有指令,从操作系统到我们打开的每一个应用程序,都是CPU在处理。

高主频的秘密: CPU之所以主频能达到GHz级别,是因为它采用的是一种叫做“指令流水线”的技术。你可以想象成一条流水线,CPU把一个复杂的计算任务分解成很多个小步骤,然后让不同的“工人”(指令流水线的不同阶段)同时处理这同一个任务的不同步骤。当第一个步骤完成了,就交给下一个步骤,而第一个步骤又可以开始处理下一个指令了。这样,虽然处理一个指令的总时间可能没有变,但单位时间内完成的指令数量大大增加了。
优势: 这种流水线设计让CPU在处理通用性任务时表现非常出色。无论是复杂的逻辑判断、数据处理还是流程控制,CPU都能灵活地应对,因为它设计之初就是为了执行各种各样的指令。
局限: 然而,CPU的通用性也带来了它的局限。为了能够处理五花八门的指令,CPU内部的设计非常复杂,包含了很多“决策单元”和“分支预测器”,这些都会消耗时间,降低了每个时钟周期能完成的“基本计算单元”的数量。而且,CPU的设计是固定的,一旦设计完成,就无法改变其内部的逻辑结构。

FPGA:可编程的“硬件大脑”,专才而非全才

再来看看FPGA,也就是现场可编程门阵列。FPGA和CPU最大的不同在于,CPU的内部逻辑是固定死的,而FPGA的内部逻辑是用户可以根据自己的需求来配置和编程的。

FPGA内部结构: FPGA内部不是由固定功能的处理单元组成的,而是由大量的、可配置的“逻辑块”(Logic Blocks)和“可编程互连资源”(Programmable Interconnects)组成的。你可以把这些逻辑块想象成一个个独立的、可以被配置成各种基本逻辑门(如AND、OR、NOT)的小零件,而可编程互连资源就像是无数条可以重新连接的导线。
“硬件化”的威力: 当我们用FPGA来实现一个计算任务时,我们实际上是在用这些逻辑块和互连资源,重新“搭建”一个专门为这个任务设计的硬件电路。比如,你要做一个乘法运算,你就可以用FPGA配置出专门的乘法器电路;你要做一个数据过滤,你就可以配置出专门的滤波器电路。
优势:
高度并行: 因为你可以为你的特定任务设计出高度并行的硬件结构,所以FPGA可以同时执行大量的计算,而不需要像CPU那样依赖流水线来提高吞吐量。想象一下,CPU是一条生产线,而FPGA可以一次性造出成千上万条专门的生产线来处理同一类型的任务。
指令定制: 你不是在执行指令,你是在实现逻辑。FPGA可以绕过CPU中那些通用的指令解码、分支预测等过程,直接将你的计算逻辑映射到硬件上,大大减少了计算的“开销”。
低延迟: 由于是直接在硬件层面进行计算,FPGA的响应速度非常快,延迟极低,特别适合对时间要求苛刻的应用。
局限:
主频不高: FPGA的“主频”通常比CPU低很多,比如几十MHz到几百MHz。这是因为FPGA的逻辑块和互连资源在灵活性和通用性上做了妥协,它们的时钟信号传播和逻辑门触发速度不如CPU那种高度优化的专用集成电路(ASIC)。
编程复杂: 相对于CPU的软件编程,FPGA的硬件描述语言(HDL,如Verilog或VHDL)编程门槛更高,设计周期也更长。

FPGA如何帮助CPU加速?

现在我们理解了它们各自的特点,就能明白为什么FPGA能帮助CPU加速了。CPU负责处理那些需要灵活性、需要执行各种指令的任务,而FPGA则负责执行那些计算密集、可以通过硬件并行化和定制化来大幅提升效率的任务。

你可以把CPU想象成一个非常聪明的总指挥,它知道全局情况,需要做出各种决策,安排任务。但是,如果有一项任务非常繁重,比如需要同时处理成千上万个相同类型的数据包(例如网络数据包的过滤和分类),CPU虽然也能做,但它需要一个接一个地处理,效率不高。

这时,FPGA就派上用场了。我们可以把这个数据包处理的任务,卸载(Offload)到FPGA上。

1. CPU将数据发送给FPGA: CPU只需要把需要处理的数据包发送给FPGA,然后告诉FPGA要做什么(这部分配置工作是设计时完成的,运行时CPU只需要触发FPGA开始工作)。
2. FPGA并行处理: FPGA会利用其内部大量可编程逻辑单元,同时对所有进入的数据包进行计算、过滤、分类等操作。就像一下子派出成千上万个专门的工人,每个人只负责一个数据包的某个处理环节,而且他们是同时工作的。
3. FPGA将结果返回给CPU: 当FPGA处理完所有数据包后,会将处理好的结果返回给CPU。

举个例子:网络包处理

CPU单独处理: CPU收到一个网络包,需要解析包头,检查源IP、目的IP、端口号,然后根据预设的规则决定是丢弃、转发还是进一步处理。这个过程,CPU需要不断地解码指令,进行逻辑判断,效率比较低,尤其是当网络流量巨大时,CPU会非常忙碌。
CPU + FPGA加速:
CPU将网络流量的规则配置到FPGA中(一次性配置)。
当数据包到达网卡时,CPU将其直接转发给FPGA。
FPGA根据内置的硬件逻辑,高速、并行地对每一个到来的数据包进行检查和分类,例如,快速匹配ACL(访问控制列表),识别特定流量类型。
FPGA只将需要CPU进一步处理的包或者处理结果发送给CPU。
CPU因此从繁重、重复的包过滤工作中解放出来,可以专注于更复杂的任务,比如应用层的处理、路由决策等。

总结一下,FPGA加速CPU并不是因为FPGA本身主频高,而是因为:

硬件专用性: FPGA可以被配置成专门的硬件来执行特定任务,而不是通用计算。
大规模并行: 它可以同时执行大量相同的计算,大大提高了吞吐量。
低延迟: 直接在硬件层面执行,绕过了CPU的指令解释和调度开销,响应速度极快。
任务卸载: 将计算密集、重复性的任务从CPU转移到FPGA,让CPU得以专注于更高级别的管理和决策。

所以,CPU和FPGA并不是竞争关系,而是协同工作的关系。CPU是“大脑”,负责思考和指挥;FPGA则像是一个超级强大的“助手”,在CPU需要时,承担起那些又脏又累但又极其需要效率的体力劳动,从而整体提升系统的性能。你可以把CPU想象成一个CEO,他需要处理战略、决策,而FPGA则像是一个高效的“执行团队”,专门负责完成CEO交给的、需要大量重复性操作的任务。

网友意见

user avatar

主频只是影响计算速度的一个因素,并不是全部。在执行一些计算密集型的任务场景中,FPGA的计算速度是更快的,目前FPGA作为CPU的协处理器已经广泛应用在Intel、AMD等公司的产品中。

CPU、GPU、和FPGA的比较

下图是左侧为CPU的组成,中间为GPU,右侧为FPGA。

桌面端的CPU为冯诺依曼结构,从上图可以看出,其基本组成为控制器,Cache,和ALU。而计算单元ALU在CPU中的占比不大,所以它的并行计算能力有限。

中间的为GPU,绿色的计算单元占了绝大部分,所以并行计算能力很强。弱点是控制能力很弱,Cache小,为了保证计算能力,就需要大量的高速DDR保证数据吞吐率。

右侧为FPGA,包含可编程的I/O、DSP、memory、PCIE等,因为大量存储单元的存在,FPGA在做计算的时候可以直接从内部存储单元读取数据。

推荐一个国外的FPGA学习网站 -- fpga4fun,里边有FPGA的介绍及26个实战项目及实现代码,非常适合入门学习!

正因为CPU、GPU、和FPGA在结构上的不同,也让他们在实际应用层面有所侧重。下图是不同体系结构性能和灵活性的比较:

目前主流的方案是把CPU、GPU和FPGA都集成在一个SoC中,通过片内总线互联。在执行并行计算的时候,比如进行图像处理,FPGA的优势就体现出来了,通过协作分工,使芯片的工作效率最大化。

目前的3D封装以及chiplet等技术为这样的组合提供了可实现性。

为什么FPGA计算速度会比CPU更快?

在执行大量的运算场景中,FPGA相比GPU的核心优势在于低延迟。FPGA比CPU延迟低,在本质上是体系结构的区别。FPGA同时拥有流水线并行和数据并行,而CPU几乎只有数据并行,虽然也会才有流水线设计,但深度受限。因此,FPGA 更适合做需要低延迟的流式处理,GPU 更适合做大批量同构数据的处理。

举个例子: [1]

我们有四个全加器,每一个的进为输出连接到下一个的进位输入,这样实现的加法器被称作行波进位加法器(Ripple-Carry Adder, RCA)。其特点为:

  • 结构特点:低位全加器的Cout连接到高一位全加器Cin
  • 优点:电路布局简单,设计方便
  • 缺点:高位的运算必须等待低位的运算完成

我们来看一下其关键路径的延迟:

总延迟时间:(T + T)*4 + T = 9T,推广到n位,总时间为(2n + 1)*T。

每一个全加器计算的时候必须等待它的进位输入产生后才能计算,所以四个全加器并不是同时进行计算的,而是一个一个的串行计算。这样会造成较大的延迟。

我们把这个电路改进一下:提前计算出“进位信号”,对进位信号进行分析。

这样我们就得到了一个:超前进位加法器(Carry-Lookahead Adder, CLA)

其中,C1、C2、C3、C4都由下面的电路计算好,需要3级门延迟,然后在全加器中关键路径上还有1级延迟,如图:

所以,总共有4级门延迟。

  • 如果采用这种完全的超前进位,理论上的门延迟都是4级门延迟
  • 实际电路过于复杂,难以实现(C31需要32位的与门和或门!)
  • 通常的方法:采用多个小规模的超前进位加法器拼接而成,例如,用4个8-bit的超前进位加法器连接成32-bit加法器。

所以我们需要更多的计算位宽或者更大的数组,或者矩阵的运算的时候,我们使用FPGA的优势就体现出来。再多的计算,也就是放置更多的硬件逻辑资源。

FPGA对CPU加速场景

下表列出了在一些特定的应用场景下,单独使用CPU和CPU+FPGA两种方案所需处理时间的对比,可见FPGA对CPU的加速效果非常明显,甚至比单独使用CPU高出1~2个数量级!

FPGA的缺点

FPGA也是有缺点的,其中之一便是开发周期长。其需要对特定的应用编写特定的FPGA。只要干的事情稍有不同,一般来说FPGA代码就要重新写一遍或者是至少要修改很多东西。如果要做的事情复杂、重复性不强,就会占用大量的逻辑资源,其中的大部分处于闲置状态。

不过,Chiplet的应用对对FPGA的开发周期有一定的优化,以下是传统FPGA开发的周期和应用chiplet的开发周期对比:

未来的方向

在现在的SoC设计中,要充分考虑不同模块的特点,FPGA 和 CPU 协同工作,充分发挥各自的长处,局部性和重复性强的归 FPGA,复杂的归 CPU。从而达到整个系统算力的最优化。

在未来,FPGA会作为协处理器和CPU、GPU共存一段时间,其主要提供以下三方面的能力:

  1. 能够提供专门的硬件加速,实现各种应用中需要的关键处理功能。
  2. FPGA设计在性能上非常灵活,使用流水线和并行结构,适应对性能的需求变化。
  3. 协处理器能为主处理器和系统存储器提供宽带,低延迟接口。

目前,英特尔,AMD,赛灵思等公司都把FPGA作为协处理器集成在SoC中作为实际应用的硬件加速解决方案,这样的设计也使得CPU和FPGA在未来的一段时间内会共存,互相配合,赋能各种计算场景。


往期精彩推荐:

低功耗CPU是怎么做到的?

为什么最好的光刻机来自荷兰,而不是芯片大国美国?

我国的光刻机开发得怎么样了?

半导体厂商如何做芯片的出厂测试?

一个芯片产品从构想到完成电路设计是怎样的过程?

参考

  1. ^计算机组成--加法器的优化 https://www.coursera.org/lecture/jisuanji-zucheng/306-jia-fa-qi-de-you-hua-Y1Q3C

类似的话题

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有