第一章 · 异构计算硬件架构基础
各位同学好。我是你们这堂课的老朋友,一个在异构计算领域摸爬滚打了十几年的工程师。今天咱们聊点硬核的——硬件架构。说白了,就是看看那些跑计算任务的芯片,到底长什么样、怎么分工、怎么连在一起。
我刚开始接触异构计算时,也以为就是CPU加个GPU完事了。后来踩了不少坑才发现,不理解硬件底层的脾气,上层软件写得再花哨也白搭。所以这一章,咱们把地基打牢。
1. CPU架构与特点 —— 那个“万金油”
CPU,中央处理器,大家太熟了。但做异构计算,你得重新认识它。CPU强在哪儿?强在低延迟、强在复杂控制、强在串行逻辑。我经常跟团队说:CPU是那个“啥都能干但啥都不精”的老大哥。
现代CPU普遍采用超标量、乱序执行、分支预测这些技术。举个例子,Intel的Golden Cove架构,一个核心可以同时解码6条指令,发射宽度也很大。但你再怎么堆核心,一个服务器CPU也就几十核。为什么?因为芯片面积和功耗撑不住。
另外,缓存层次结构你得心里有数。L1、L2、L3,每一级延迟差一个数量级。我见过有人把热点数据放在L3之外,性能直接腰斩。嗯,这都是真金白银换来的教训。
2. GPU架构与CUDA核心 —— 并行怪兽
GPU就不一样了。它天生为大规模并行而生。一个GPU有几千个CUDA核心,但每个核心很轻量。说白了,GPU就是“人多力量大”,适合那些可以拆成成千上万个小任务的计算。
NVIDIA的Ampere架构,一个SM(流多处理器)里有128个CUDA核心。加上Tensor Core、RT Core,专为AI和图形优化。我当年第一次写CUDA程序时,把CPU上的循环直接搬过去,结果慢得一塌糊涂。后来才明白:GPU需要数据并行,需要合并访问,需要避免分支发散。
// 一个简单的CUDA向量加法 —— 展示并行之美
__global__ void vecAdd(float *A, float *B, float *C, int N) {
int i = blockIdx.x * blockDim.x + threadIdx.x;
if (i < N) C[i] = A[i] + B[i];
}
你看,每个线程只算一个元素。成千上万个线程同时跑,速度自然快。但要注意:CPU和GPU之间的数据传输是瓶颈。PCIe带宽再高,也扛不住频繁搬运。我习惯把数据尽量留在GPU端,一次传完,多次计算。
3. FPGA可编程逻辑原理 —— 硬件级别的“软件”
FPGA,现场可编程门阵列。它既不是纯软件,也不是纯硬件。你可以把它看成一块“乐高底板”,用逻辑单元和布线资源搭出你想要的数字电路。说白了,FPGA是用代码画电路。
我最早接触FPGA时,觉得这东西太灵活了。你可以实现一个自定义的加法器、一个专用的FFT引擎,甚至一个完整的CPU软核。但代价是什么?开发难度大、频率上不去(通常几百MHz)、资源有限。
FPGA的编程模型是硬件描述语言,比如Verilog或VHDL。举个例子,一个简单的状态机:
// Verilog 片段:一个简单的计数器
module counter (
input clk, rst_n,
output reg [7:0] count
);
always @(posedge clk or negedge rst_n) begin
if (!rst_n) count <= 8'd0;
else count <= count + 1;
end
endmodule
你看,这跟软件完全不是一个思路。FPGA里没有“顺序执行”,所有逻辑都是并行的。我刚开始写Verilog时,总想着“先做A再做B”,结果综合出来的电路完全不对。后来才习惯用“硬件思维”——想清楚每个时钟沿该干什么。
4. ASIC与TPU/NPU专用芯片
ASIC,专用集成电路。为特定算法量身定制,性能、功耗、面积都最优。但缺点也很明显:流片成本高、周期长、一旦定稿就不能改。说白了,ASIC是“一锤子买卖”。
Google的TPU(张量处理单元)就是个典型。它专门为TensorFlow优化,矩阵乘法单元(MXU)又大又暴力。我研究过TPU的架构,它的核心是一个脉动阵列,数据在阵列里像流水一样流动,计算效率极高。
NPU(神经网络处理器)也是类似思路。华为的达芬奇架构、寒武纪的NPU,都在AI推理场景里大放异彩。这些芯片把卷积、池化、激活函数都做成了硬件硬核,一条指令就能完成一层计算。
| 芯片类型 | 灵活性 | 性能/功耗 | 开发周期 | 典型场景 |
|---|---|---|---|---|
| CPU | 极高 | 中 | 短 | 控制、通用计算 |
| GPU | 高 | 高(并行) | 中 | 图形、AI训练 |
| FPGA | 中高 | 中高 | 中长 | 原型、低延迟加速 |
| ASIC/TPU | 低 | 极高 | 长 | 量产、固定算法 |
我个人觉得,选择哪种芯片,本质上是在“灵活性”和“效率”之间做权衡。项目初期用FPGA验证,量产后转ASIC,这是很多公司的套路。
5. 异构总线与互联技术 —— 把大家连起来
芯片再强,连不起来也是白搭。异构计算里,互联技术是真正的“血管”。
PCIe 是目前最通用的。从PCIe 3.0到5.0,带宽翻倍,延迟也在降。但PCIe是树状拓扑,CPU是根节点,所有设备都要经过CPU。这就有瓶颈了——多个设备同时通信时,CPU可能成为“交通警察”。
CXL(Compute Express Link)和 CCIX(Cache Coherent Interconnect for Accelerators)是新一代互联标准。它们最大的特点是缓存一致性。什么意思?就是CPU和加速器可以共享内存,不用来回拷贝数据。我参与过一个CXL项目,把FPGA直接挂载到CPU的内存总线上,延迟从微秒级降到了纳秒级,效果非常震撼。
另外,NVLink(NVIDIA自家互联)和InfiniBand(高性能计算)也值得关注。NVLink在GPU之间提供超高带宽,适合多卡训练。InfiniBand则主打RDMA,延迟极低。
嗯,互联这块水很深。我见过有人用PCIe交换机搭了8卡GPU服务器,结果因为拓扑没设计好,跨卡通信带宽被严重限制。后来改成NVLink + PCIe混合拓扑,才把性能跑满。所以,互联拓扑和带宽规划,一定要在项目初期就考虑清楚。
lspci -vvv 可以查看Linux下PCIe设备的链路状态、带宽和协商速度。我每次调试异构系统,第一件事就是跑这个命令,确认所有设备都跑在正确的速率上。
好了,这一章的内容就是这些。从CPU到GPU,从FPGA到ASIC,再到把它们串起来的互联技术。硬件是异构计算的骨架,理解它们,你才能写出真正高效的软件。下一章咱们会深入软件栈,看看怎么给这些硬件“发号施令”。