Answers:
CPU是顺序处理设备。他们将算法分解为一系列操作,并一次执行一次。
FPGA是(或可以配置为)并行处理设备。整个算法可能在单个时钟滴答中执行,或者在最坏的情况下,其时钟滴答要比顺序处理器少。逻辑复杂度增加的代价之一通常是设备时钟的下限。
考虑到以上几点,FPGA可以胜过CPU的某些任务,因为它们可以在更少的时钟周期内完成相同的任务,尽管总体时钟速率较低。可以实现的增益高度依赖于算法,但是对于像FFT这样的东西,至少一个数量级并不是典型的。
此外,因为您可以在FPGA中构建多个并行执行单元,所以如果您要通过同一算法传递大量数据,则可以跨并行执行单元分配数据并获得更高数量级的吞吐量即使使用多核CPU也无法实现。
您为优势付出的代价是功耗和$$$。
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的有效部分,
此处提供的所有其他流行的答案都讨论了FPGA和CPU之间的字面差异。他们指出了FPGA的并行特性与CPU的顺序特性,或者给出了为什么某些算法在FPGA上可以很好地工作的示例。所有这些都是正确的,但是我建议CPU和FPGA之间存在更根本的区别。
FPGA和CPU之间的共同点是什么?它们都建立在硅片上。在某些情况下,实际上是相同的硅工艺。
根本的区别是我们堆积在硅片上的抽象。一个人不可能理解从硅片到封装IC的单一现代CPU设计的全部细节。因此,作为工程过程的一部分,我们将复杂的问题分为较小的可管理问题,人类可以将其包裹住。
考虑将硅片变成可正常运行的CPU所需的时间。这是该目标所需的抽象层的简化视图:
首先,我们有工程师,他们知道如何用硅制造晶体管。他们知道如何设计功率为10兆赫兹或什至100吉赫兹的微型晶体管,它们可以汲取功率并进行开关,并且知道如何设计强大的晶体管,这些晶体管可以驱动足够大的信号功率,以将其发送出IC封装并通过PCB到另一个芯片。
然后,我们有了数字逻辑设计师,他们知道如何将这些晶体管放到具有数百个不同逻辑单元的库中。逻辑门,触发器,多路复用器和加法器仅举几例。全部具有多种配置。
接下来,我们有各种工程师团队,他们知道如何将这些数字(有时是模拟)模块放在一起以形成更高级别的功能模块,例如高速收发器,存储器控制器,分支预测器,ALU等。
然后,我们让CPU设计人员通过将这些功能单元整合到一个完整的系统中来设计高端CPU设计。
而且不止于此。至此,我们有一个运行中的CPU,它运行汇编代码,但这不是大多数程序员如今写的语言。
而且抽象层可以从那里继续。这里重要的一点是,这些抽象层相结合,产生了一个基于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具有许多抽象设计,使它们易于开发,可扩展且便宜。但是他们为获得这些利益放弃了交易的速度和力量。
虽然其他答案都是正确的,但它们都还没有解决您所提问题中的比特币挖掘示例,这确实是一个不错的示例。比特币挖矿涉及重复计算密码哈希函数,即另一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的配置)方面拥有完全的自由度时,门数和布线开销的效率也会降低,甚至可以提供更好的性能。 。
上面的答案虽然正确,但是却忽略了为何FPGA(和定制ASIC)特别适合比特币计算的观点。
真正的优点是SHA-256的大部分计算都是可以在接线中完成的逻辑运算(例如,移位)。用这种方法完成后,它们需要0个时钟周期。
另一个重要的优点是,FPGA的功耗效率(即每瓦MIPS)比CPU高得多,因此计算所需的能量要少得多。这一点很重要,因为开采比特币的成本取决于您用来制造比特币的电量。
ASIC芯片比FPGA更具能源效率,因此它们可以更便宜地执行同一代码。您还可以在板上装载更多执行单元,以使其更快。缺点是制造定制ASIC的成本非常高,因此您将需要出售大量芯片来支付制造成本。
GPU还用于制造比特币,但是由于它们的能源效率低得多,因此已经在FPGA和定制ASIC方面失去了基础。