FPGA为什么快?
CPU、GPU都属于冯·诺依曼结构,指令译码执行、共享内存。FPGA之所以比CPU甚至GPU能效高,本质上是无指令、无需共享内存的体系结构带来的福利。
冯氏结构中,由于指令流的控制逻辑复杂,不可能有太多条独立的指令流,因此GPU使用SIMD(单指令流多数据流)来让多个执行单元以同样的步调处理不同的数据,CPU也支持SIMD指令。而FPGA每个逻辑单元的功能在重编程(烧写)时就已经确定,不需要指令。
冯氏结构中使用内存有两种作用。一是保存状态,二是在执行单元间通信。由于内存是共享的,就需要维持执行部件间缓存的一致性。对于保存状态的需求,FPGA中的寄存器和片上内存(BRAM)是属于各自的控制逻辑的,无需不必要的仲裁和缓存。
FPGA实际的表现如何呢?我们分别来看计算密集型任务和通信密集型任务。
计算密集型任务的例子包括矩阵运算、图像处理、机器学习等。这类任务一般是CPU把任务卸载给FPGA去执行。对这类任务,目前我们正在用的Intel StratixV FPGA的整数乘法运算性能与20核的CPU基本相当,浮点乘法运算性能与8核的CPU基本相当,而比GPU低一个数量级。我们将用的下一代FPGA,Stratix 10,将配备更多的乘法器和硬件浮点运算部件,从而理论上可达到与现在的顶级GPU计算卡旗鼓相当的计算能力。