
作者:Challey
五月中旬,中国商飞公司的C919大飞机从浦东机场起飞,标志着国产大飞机C919正式开启商用之路。五月下旬,有报道曝光C919的座舱显示系统采用HKM9000 GPU图形处理器,已经实现了完全的国产化。这款航电GPU采用了完全自主的指令架构、核心算法、图形流水、软硬件代码及生态,本文就GPU的架构及其研发难度进行重点介绍。


HKM9000 GPU图形处理器由航空工业计算所翔腾微电子公司从2014年开始研发,历时6年,于2020年4月研制成功。这也是国内第一款应用到民航领域的专用GPU芯片。
从多年前就流行的游戏,到最近几年在比特币等数字货币的挖矿等盛行的领域,主要的核心硬件就是GPU显卡(后来挖矿采用了其他更简洁的方案)。
也许有人认为GPU比较简单,不会比CPU复杂。然而,在GPU领域,目前英伟达(NVIDIA)是当之无愧的龙头老大,桌面和移动端CPU处理器领域的英特尔、AMD等公司的技术和产品都与英伟达有相当的差距。
虽然GPU与CPU并不能一定说谁的技术难度更大,但GPU的研发难度也是非常大的,在某种情况下比CPU更难,这种难度首先就体现在架构上,因为现在发展的GPU架构已经在主要的几大公司中形成了专利壁垒。
GPU架构
通用的CPU是SISD架构,而GPU架构是SIMD。

从平面角度看是:

SISD机器是一种传统的串行计算机,它的硬件不支持任何形式的并行计算,所有的指令都是串行执行。并且在某个时钟周期内,CPU只能处理一个数据流。因此这种机器被称作单指令流单数据流机器。早期的计算机都是SISD机器,如冯诺.依曼架构,如IBM PC机,早期的巨型机和许多8位的家用机等。
SIMD是采用一个指令流处理多个数据流。这类机器在数字信号处理、图像处理、以及多媒体信息处理等领域非常有效。GPU就是这样的架构。
GPU架构就是围绕一个流式多处理器(SM)的扩展阵列搭建的。通过复制这种结构来实现GPU的硬件并行。包含了关键组件:
- CUDA核心
- 共享内存/一级缓存
- 寄存器文件
- 加载/存储单元
- 特殊功能单元
- 线程束调度器
Fermi 架构(NVIDIA)
Fermi架构是第一个完整的GPU架构,这是英伟达(NVIDIA)公司推出的架构。

来源:NVIDIA官方文档
Fermi逻辑架构中包含具体数据如下:
- 512个加速核心,CUDA核
- 每个CUDA核心都有一个全流水线的整数算数逻辑单元ALU,和一个浮点数运算单元FPU
- CUDA核被组织到16个SM上
- 6个384-bits的GDDR5 的内存接口
- 支持6G的全局机栽内存
- GigaThread疫情,分配线程块到SM线程束调度器上
- 768KB的二级缓存,被所有SM共享
SM包括下面这些资源:
- 执行单元(CUDA核)
- 调度线程束的调度器和调度单元
- 共享内存,寄存器文件和一级缓存
每个多处理器SM有16个加载/存储单元所以每个时钟周期内有16个线程(半个线程束)计算源地址和目的地址。
特殊功能单元SFU执行固有指令,如正弦,余弦,平方根和插值,SFU在每个时钟周期内的每个线程上执行一个固有指令。
每个SM有两个线程束调度器,和两个指令调度单元,当一个线程块被指定给一个SM时,线程块内的所有线程被分成线程束,两个线程束选择其中两个线程束,在用指令调度器存储两个线程束要执行的指令。