FPGA如何胜过CPU?


55

我听说有人使用FPGA来改善诸如比特币挖掘,电子交易和蛋白质折叠之类的系统的性能。

当CPU运行速度通常至少快一个数量级(就时钟速度而言)时,FPGA如何与CPU竞争?


13
FPGA一次完成所有操作。
伊格纳西奥·巴斯克斯

Answers:


48

CPU是顺序处理设备。他们将算法分解为一系列操作,并一次执行一次。

FPGA是(或可以配置为)并行处理设备。整个算法可能在单个时钟滴答中执行,或者在最坏的情况下,其时钟滴答要比顺序处理器少。逻辑复杂度增加的代价之一通常是设备时钟的下限。

考虑到以上几点,FPGA可以胜过CPU的某些任务,因为它们可以在更少的时钟周期内完成相同的任务,尽管总体时钟速率较低。可以实现的增益高度依赖于算法,但是对于像FFT这样的东西,至少一个数量级并不是典型的。

此外,因为您可以在FPGA中构建多个并行执行单元,所以如果您要通过同一算法传递大量数据,则可以跨并行执行单元分配数据并获得更高数量级的吞吐量即使使用多核CPU也无法实现。

您为优势付出的代价是功耗和$$$。


2
+1; FPGA不像CPU那样动态,这就是为什么CPU通常更适合PC的原因
Nick Williams

17
“为优势而付出的代价是功耗和$$$。” -这通常是正确的,但是在许多算法上,您可以用低端的$ 50 Xilinx Spartan-6击败高端的$ 1000的Intel Xeon机器。但这通常需要大量的工程时间,并且您最终可能会获得非常自定义的设计,该设计仅适用于一个应用程序并且很难更改。因此,权衡不仅是能力和金钱,还在于算法开发时间,可重用性和灵活性。(尽管您可以争论时间==金钱。)
wjl 2014年

市场,关于您的最后一句话,FPGA的功耗不是比CPU低很多吗?CPU和FPGA都有各种各样的设备,但是如果我们看一下用于比特币挖掘等设备的设备,那么用于这些任务的CPU所消耗的电能是否比FPGA所消耗的电能要多得多。用过的?
David Gardner 2014年

4
@David:在谈论比特币开采时,相关指标是每瓦特的哈希数。Markt在谈论总体功耗。也就是说,给定的FPGA功耗可能是典型CPU的3倍,但比特币挖掘的速度要快3倍以上。因此对于比特币而言,这是一个胜利。
Billy ONeal 2014年

2
@Billy:每瓦·秒的哈希数,而不是每瓦。
圣保罗Ebermann

34

Markt基本上是正确的,但我将在这里投入2美分:

想象一下,我告诉过您我想编写一个程序来反转32位整数中的位顺序。像这样:

int reverseBits(int input) {
    output = 0;
    for(int i = 0;i < 32;i++) {
        // Check if the lowest bit is set
        if(input & 1 != 0) {
            output = output | 1; // set the lowest bit to match in the output!
        }

        input = input >> 1;
        output = output << 1;
    }
    return output;
}

现在,我的实现并不完美,但是我确信您同意这样做会涉及到一些操作,并且可能还会存在某种循环。这意味着在CPU中,您花费了超过1个周期来实现此操作。

在FPGA中,您可以简单地将其连接为一对锁存器。您将数据放入某个寄存器,然后以相反的位顺序将其连接到另一个寄存器中。这意味着该操作将在FPGA中的单个时钟周期内完成。因此,FPGS在一个周期内完成了一项操作,该操作使您的通用CPU花费了数千个周期才能完成!另外,您可以并行连接这些寄存器中的几百个。因此,如果您可以将数百个数移到FPGA上,那么在一个周期内,它将在数百个FPGA时钟周期内完成数百次数千次操作。

通用CPU可以做很多事情,但是作为限制,我们设置了通用和简单指令,这些指令必须扩展为简单指令列表才能完成某些任务。因此,我可以使通用CPU拥有“ 32位寄存器的反向位顺序”之类的指令,并赋予CPU与我们刚刚构建的FPGA相同的功能,但是有无数种此类可能有用的指令,因此我们只放入那些可以保证流行CPU成本的产品。

FPGA,CPLD和ASIC都使您可以访问原始硬件,从而使您可以定义疯狂的操作,例如“使用密钥解密AES256加密字节”或“解码h.264视频的帧”。它们在FPGA中具有超过一个时钟周期的延迟,但是与以数百万行的通用汇编代码写出操作相比,可以用更加有效的方式实现它们。这还具有使许多此类操作的固定用途FPGA / ASIC更加节能的好处,因为它们不必做过多的工作!

并行性是markt指出的另一部分,尽管它也很重要,但是最主要的是FPGA在执行操作所需的周期方面并行化了CPU中已经很昂贵的数据。一旦您开始说“我可以在10个FPGA周期中执行一个任务,这需要花费我的CPU 100,000个周期,并且我一次可以并行执行4个任务,”您就可以很容易地理解为什么FPGA可能会占用大量资源比CPU快!

那么,为什么不对所有内容使用FPGA,CPLD和ASIC呢?因为一般来说,它是一个完整的芯片,只执行一项操作即可。这意味着,尽管您可以使一个过程在FPGA / ASIC中更快地运行多个数量级,但是当该操作不再有用时,您将无法稍后对其进行更改。一旦插入电路中就无法(通常)更改FPGA的原因是接口的布线是固定的,并且通常电路中不包含允许您重新对FPGA进行更有用配置的组件。有一些研究人员试图构建混合式FPGA-CPU模块,其中一部分CPU像FPGA一样可以进行重新接线/重新编程,从而可以“装载” CPU的有效部分,


2
对于反转位(以及所有其他位交换/选择任务)的示例,它实际上并不需要1个时钟周期,而是需要0。在您的示例中,将数据存储在锁存器中需要1个时钟周期,而不是1。相同的操作。无论是否反转这些位,都需要1个时钟周期。反转位的操作为0个时钟周期;没有开销,只是路由不同。不同之处不仅在于语义,特别是当您开始添加内容时。例如,将32位字向下移动3位,然后每隔一个半字节交换一次,然后反转它需要多长时间?
wjl 2014年

1
“混合式FPGA-CPU模块”-这些已经在市场上存在很长时间了(有关成功的现代模块,请参见xilinx.com/products/silicon-devices/soc/zynq-7000/index.htm),但甚至没有特殊支持通常将软件与HDL结合起来,方法是在结构上的FPGA内部实现一个软CPU。
wjl 2014年

@wjl是正确的,从技术上讲,它本身不需要任何周期即可执行操作。我认为您的示例在语义上只是有所不同,主要是因为执行这三个操作在逻辑上会转换为固定的位模式(即,我以b1b2b3b4开始,而我以b3b1b4b2结尾)。在整个答案中,这是我的观点。我试图指出,仅当您具有固定的指令集/门布置时,才有必要将操作描述为一系列步骤。
Kit Scuzz

@wjl:以david-gardner提出问题的方式,他似乎是在说“ CPU”等同于Intel或AMD x86 / x86_64高度时钟,流水线和优化的CPU。有许多软“ CPU”,但我设计的FPGA中没有一个可以像i7那样被时钟控制,它们也几乎没有优化或能力。至于混合动力车,我的意思更多是这样的:newsroom.intel.com/docs/DOC-1512显然确实存在
Kit Scuzz 2014年

1
Zynq确实不是一个处理器(ARM Cortex-A9,与运行平板电脑等相同的处理器),但是我同意拥有一个具有高速x86_64的集成FPGA会更加出色。=)
wjl 2014年

25

此处提供的所有其他流行的答案都讨论了FPGA和CPU之间的字面差异。他们指出了FPGA的并行特性与CPU的顺序特性,或者给出了为什么某些算法在FPGA上可以很好地工作的示例。所有这些都是正确的,但是我建议CPU和FPGA之间存在更根本的区别。

FPGA和CPU之间的共同点是什么?它们都建立在硅片上。在某些情况下,实际上是相同的硅工艺。

根本的区别是我们堆积在硅片上的抽象。一个人不可能理解从硅片到封装IC的单一现代CPU设计的全部细节。因此,作为工程过程的一部分,我们将复杂的问题分为较小的可管理问题,人类可以将其包裹住。

考虑将硅片变成可正常运行的CPU所需的时间。这是该目标所需的抽象层的简化视图:

  1. 首先,我们有工程师,他们知道如何用硅制造晶体管。他们知道如何设计功率为10兆赫兹或什至100吉赫兹的微型晶体管,它们可以汲取功率并进行开关,并且知道如何设计强大的晶体管,这些晶体管可以驱动足够大的信号功率,以将其发送出IC封装并通过PCB到另一个芯片。

  2. 然后,我们有了数字逻辑设计师,他们知道如何将这些晶体管放到具有数百个不同逻辑单元的库中。逻辑门,触发器,多路复用器和加法器仅举几例。全部具有多种配置。

  3. 接下来,我们有各种工程师团队,他们知道如何将这些数字(有时是模拟)模块放在一起以形成更高级别的功能模块,例如高速收发器,存储器控制器,分支预测器,ALU等。

  4. 然后,我们让CPU设计人员通过将这些功能单元整合到一个完整的系统中来设计高端CPU设计。

而且不止于此。至此,我们有一个运行中的CPU,它运行汇编代码,但这不是大多数程序员如今写的语言。

  1. 我们可能有一个C编译器来编译成汇编代码(可能通过一些中间表示)
  2. 我们可以在C之上添加另一个抽象,以获得面向对象的语言
  3. 我们甚至可能在C或C ++之上编写虚拟机,以便我们可以解释Java字节码之类的内容

而且抽象层可以从那里继续。这里重要的一点是,这些抽象层相结合,产生了一个基于CPU的系统,该系统可以大规模扩展并且仅花费定制硅片设计的一小部分。

但是,这里要指出的重要一点是,每个抽象本身也要承担成本。晶体管设计人员并没有为每个用例构建完美的晶体管。他建立了一个合理的库,因此有时使用的晶体管消耗的功率或硅要比实际工作所需的功率多一点。同样,逻辑设计人员不会构建所有可能的逻辑单元。他们可能会构建4输入NAND门和8输入NAND门,但是当另一位工程师需要6输入NAND时会发生什么呢?他使用一个8输入NAND门,并束缚了2个未使用的输入,这导致了硅资源的浪费和电力不足。因此,它沿着抽象链上升。每层都为我们提供了一种处理复杂性的方法,

现在将这些抽象与FPGA所需的抽象进行比较。本质上,FPGA抽象在以上列表中的#2处停止。FPGA使开发人员可以在数字逻辑层工作。它比这要复杂得多,因为在这一层上对CPU进行了“硬编码”,并且必须在运行时配置FPGA(顺便说一句,这就是为什么CPU通常以更高的频率运行),但是最重要的重要事实是,事实远非如此FPGA的抽象比CPU少。

那么,为什么FPGA可以比CPU更快? 从本质上讲,这是因为FPGA使用的抽象要比CPU少得多,这意味着设计人员需要更接近芯片。他没有支付CPU所需的所有许多抽象层的费用。他的编码水平较低,必须付出更多的努力才能实现给定的功能,但是他获得的性能更高。

但是,当然也存在较少的抽象缺点。所有这些CPU抽象都有其充分的理由。它们为我们提供了更简单的编码范例,这意味着更多的人可以轻松地为他们开发。这又意味着存在更多的CPU设计,因此我们从CPU中获得了巨大的价格/规模/上市时间收益。

所以你有它。FPGA具有较少的抽象,因此它们可以更快,更节能,但难以编程。CPU具有许多抽象设计,使它们易于开发,可扩展且便宜。但是他们为获得这些利益放弃了交易的速度和力量。


而且,FPGA是使用简单的重复块设计的,这些重复块将执行简单的逻辑任务。它们是为某些类型的任务量身定制的。CPU(OTOH)具有许多复杂的功能部件,它们都在做不同的事情。可以认为一个CPU是一组由许多类似FPGA的设备组成的设备(毕竟,它们全都是硅,电子和数学运算)。因此,这与抽象无关,而与复杂性有关。CPU是由许多不同类型的电气设备组成的复杂设备,而FPGA由少数几种电气设备组成。CPU是a弹枪,而FPGA是步枪。
AbstractDissonance

21

虽然其他答案都是正确的,但它们都还没有解决您所提问题中的比特币挖掘示例,这确实是一个不错的示例。比特币挖矿涉及重复计算密码哈希函数,即另一SHA-256计算结果的SHA-256,该数据仅更改一个32位整数,直到所得哈希具有某些属性为止。每个SHA-256由相同算法的64次重复组成,涉及32位加法,移位和更多位处理操作。

如果在32位(或更多)CPU上对此循环进行编程,则会发现其指令集非常适合该任务-SHA-256设计为可在CPU上高效运行。仍然,您将只使用现代CPU硅面积的2%,具有诸如缓存,乘法,除法,浮点运算,分支和分支预测等面积密集型功能,这些功能根本没有使用或无法提供显着的功能。该特定任务的性能提升。

在像FPGA这样的可配置硬件中,您只需实现这2%,然后通过忘记所有有关代码执行的方式来进一步优化,而是设计门以直接计算那些经常重复的子功能中的每一个。经过流水线处理,使它们每个都将结果传递到下一个每个时钟周期,并重复128次(以及每个SHA-256开始和结束的某些特殊附加逻辑),您最终会在每个时钟周期获得结果(可能在宣传为支持300 MHz的FPGA上,每秒可散列1亿个哈希,而在现代CPU上,每核每千个时钟周期可得到一个结果,例如,在多核多核上,每秒可产生1000万个散列-GHz CPU。

如果您对这个特定示例感兴趣,那么您可能想看看我有关bitcoin.stackexchange上ASIC矿工内部的相关答案,因为许多FPGA矿工使用可配置的而非定制的硬件以相同的方式工作。出于完整性的考虑:还有其他可能性,例如限制或避免流水线,我通过使用多个独立的SHA-256散列来简化平凡的并行化。依靠FPGA内部及其总尺寸的限制,即使您在设计整个芯片(而不只是FPGA的配置)方面拥有完全的自由度时,门数和布线开销的效率也会降低,甚至可以提供更好的性能。 。


3
关于硅的利用,这是一个很好的观点。
markt 2014年

但是,考虑到FPGA由具有许多物理门的有些复杂的单元组成,一个典型的应用程序又只使用了一部分,这可能(无意!)引起了误解,这让他们的制造商可以宣传等效的门数以试图告诉您所有的门数。其中的一个“典型”应用可能值得...
金字塔

3

上面的答案虽然正确,但是却忽略了为何FPGA(和定制ASIC)特别适合比特币计算的观点。

真正的优点是SHA-256的大部分计算都是可以在接线中完成的逻辑运算(例如,移位)。用这种方法完成后,它们需要0个时钟周期。

另一个重要的优点是,FPGA的功耗效率(即每瓦MIPS)比CPU高得多,因此计算所需的能量要少得多。这一点很重要,因为开采比特币的成本取决于您用来制造比特币的电量。

ASIC芯片比FPGA更具能源效率,因此它们可以更便宜地执行同一代码。您还可以在板上装载更多执行单元,以使其更快。缺点是制造定制ASIC的成本非常高,因此您将需要出售大量芯片来支付制造成本。

GPU还用于制造比特币,但是​​由于它们的能源效率低得多,因此已经在FPGA和定制ASIC方面失去了基础。


如果您看一下Monero哈希算法又名cryptonight,您会发现FPGA的实现几乎是不可能的,因为需要随机访问大量内存(2MB)。在这种情况下,CPU具有优势。
lucas92 '17
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.