计算机

以下是维基百科的定义:

电子计算机(Electronic computer)亦称电脑,是利用数字电子技术,根据一系列指令指示并且自动执行任意算术或逻辑操作串行的设备。通用计算机因有能遵循被称为“程序”的一般操作集的能力而使得它们能够执行极其广泛的任务。

计算机被用作各种工业和娱乐设备的控制系统。这包括简单的特定用途设备(如微波炉和遥控器)、工业设备(如工业机器人和计算机芯片),及通用设备(如个人电脑和智能手机之类的移动设备)等。

从单片机(MCU),SoC,手机,PC,服务器,超级计算机不同规模的设备都属于计算机。

CPU

计算机由软件驱动,执行不同的任务。计算机执行的程序由一条条指令组成,这些指令主要由CPU解释和执行。

现代处理器一般无法完全归类为冯·诺依曼架构或哈佛架构,而是汲取各自的精华,包含了两者的特点。

比如现代Intel CPU L1缓存分为指令缓存和数据缓存,这体现了哈佛架构中指令与数据储存分开的特点;而CPU访问主存时,却不会区分指令和数据存储,这体现了冯·诺依曼结构的特点。

协处理器

CPU是为了通用任务而设计的,对于某些特定的任务,性能会比较差,或者无法实现。于是出现了各种协处理器(Coprocessor)。CPU把它不擅长或者做不到的事情卸载(offload)到协处理器上。

Offload就是CPU和协处理器的协作过程,比如通信以分配任务,获取结果等。具体的通信方式跟CPU和协处理器的设计以及架构有关,例如共享内存空间,DMA,中断等。

8087

早期CPU浮点计算性能差,出现了如Intel 8087协处理器。它可以与8086,8088等CPU一起工作。现代CPU中浮点运算器都已经集成在CPU中,不再需要浮点运算协处理器。https://www.elprocus.com/coprocessor/以8087为例讲了协处理器。

接口芯片

另外各种接口控制芯片(如SATA接口控制芯片)也可以认为是协处理器。CPU与外部接口之前按照一定的协议进行数据交换与控制。 比如最简单的UART串口,通过对特定内存地址的写入读取来对串口进行数据写入读取,还可以控制波特率等。

GPU

GPU也是一种协处理器,擅长并行处理简单任务。随着AI,区块链等技术的发展,GPU变得越来越复杂。GPU一般拥有自己的指令集。但是它还是在CPU的协调下进行工作。

OpenGL,DirectX,CUDA等库封装了CPU与GPU的交互过程,降低了编程难度。 https://superuser.com/questions/461022/how-does-the-cpu-and-gpu-interact-in-displaying-computer-graphics 这里有一些稍微具体的讨论和说明。

智能网卡

另一种较复杂的协处理器的例子是智能网卡(Smart NIC)。可以把网络数据面的一些操作offload到智能网卡上。在Linux网络栈或Open vSwitch中都有一些offload的点。

不管具体哪种offload方式,都需要CPU(上运行的指令)主动offload到协处理器。比如早期版本Open vSwitch不支持网卡offload,那么,即使有智能网卡也没用。

DPU

从智能网卡进一步发展,出现了DPU。DPU几乎发生了质变,已经不能算作一种协处理器了。DPU产品如AWS的Nitro,Nvida的BlueField,阿里神龙;Intel的IPU(Infrastructure Processing Unit)跟DPU类似。

DPU把更多的任务卸载到DPU上,多到DPU本身已经包含了完整的操作系统。然后DPU虚拟出存储,网卡等为服务器所使用。可参考 AWS Nitro架构简介

DPU与协处理器

协处理器是方案是CPU搭配专用设备,而DPU方案更像是在DPU上搭配一个服务器,这个服务器几乎只提供计算能力,网络和存储都被卸载到DPU了,DPU在一定程度上反客为主。

其他Reference

由mellanox DPU bluefield-2想到的问题用mellanox DPU实现裸金属服务器 这两个链接有使用DPU的实例,包括在DPU系统和服务器系统里看到的设备情况等,可以帮助对DPU有个更具象的了解。

写一下DPU 对DPU和相关技术做了一些归纳和分类,以及演进的一些思考。

FPGA

FPGA(Field Programmable Gate Array) 现场可编程门阵列。属于可编程逻辑器件的一种,可以直接编程硬件。 对FPGA编程可以改变FPGA的硬件逻辑,而对上面各种处理器编程,是使用CPU/协处理器提供的指令或接口来编程,不能对硬件本身的逻辑进行修改。

FPGA一般基于查找表结构。查找表(Look Up Table),LUT本质上是一个RAM。例如对4输入的LUT,当用户通过原理图或HDL语言描述一个逻辑电路后,对应四个输入的不同组合,有16种不同输入,每种输入都会对应一种输出。 FPGA开发软件自动计算对应的输出,并把结果实现写入RAM。这样当FPGA实际执行起来,根据输入直接查表就能得到输出。这就是FPGA的基本原理。当然实际的FPGA芯片会复杂的多。

FPGA一般来说比专用集成电路(ASIC)的速度要慢,无法完成更复杂的设计,并且会消耗更多的电能。但是,FPGA具有很多优点,比如可以快速成品,而且其内部逻辑可以被设计者反复修改,从而改正程序中的错误,此外,使用FPGA进行调试的成本较低。

结语

现代Intel/AMD的CPU提供微码更新能力,各种接口控制芯片也基本可以更新固件。通过更新固件,可以修复Bug,改善性能等。 在这个角度上,这些硬件也是可编程的。但是灵活性远不如FPGA,也不是主要的应用场景。软件开发者在开发时一般不需要考虑固件。 另一方面,FPGA中一般也会包含RAM,时钟,内嵌专用硬件模块的不可编程结构。

本质上,CPU/协处理器/FPGA都是集成电路。只是根据不同的应用场景和技术工艺,形成了不同的门类。