news 2026/9/13 9:45:27

不到 1300 行 Verilog 代码跑起来的极简 GPU:一份完整的 GPU 架构上手路径

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
不到 1300 行 Verilog 代码跑起来的极简 GPU:一份完整的 GPU 架构上手路径

不到 1300 行 Verilog 代码跑起来的极简 GPU:一份完整的 GPU 架构上手路径

【免费下载链接】tiny-gpuA minimal GPU design in Verilog to learn how GPUs work from the ground up项目地址: https://gitcode.com/GitHub_Trending/ti/tiny-gpu

tiny-gpu 是一个极简 GPU 实现:12 个 Verilog 文件、约 1300 行代码,却真能执行矩阵乘法和矩阵加法内核。它把渲染、光栅化这些图形功能全部砍掉,只留下指令集、多线程执行和内存访问这几块"承重墙",专门用来回答一个问题——GPU 架构到底是怎么转起来的。

这篇文章不讲概念,带你先把这个 GPU 仿真跑起来,再顺着执行轨迹把它的内部一层层拆开。

五分钟跑起来极简 GPU 仿真

整个仿真链路只需要三样东西:iverilog(一个开源的 Verilog 编译器)、cocotb(用 Python 写的硬件测试框架)、sv2v(把 SystemVerilog 转成 Verilog 的转换器,因为 iverilog 不直接吃.sv文件)。按顺序装好它们,再建一个构建目录:

# 安装 Verilog 编译器与 cocotb 仿真框架 brew install icarus-verilog pip3 install cocotb # 从 sv2v 官方 releases 下载预编译二进制并放入 PATH,然后: mkdir build

装完就开工。仓库用 Makefile 把"转换源码 → 编译 → 仿真"整条链串好了,跑矩阵加法和矩阵乘法各只需一条命令:

# 矩阵加法内核:8 个线程并行做 8 次元素相加 make test_matadd # 矩阵乘法内核:4 个线程各算 2x2 矩阵的一个元素 make test_matmul

跑完后去test/logs目录找日志文件,里面按顺序记着:初始数据内存、逐周期执行轨迹、最终数据内存。开头能看到输入的两个矩阵,结尾就是算出来的结果矩阵。一次完整的 Verilog GPU 仿真,到这一步就算成了。🚀

看执行轨迹:亲眼看见 4 个线程并行计算

先打开矩阵乘法的日志。这个 2x2 矩阵乘法内核一共发射 4 个线程,每个线程负责结果矩阵里的一个格子:线程自己用编号算出"我负责第几行第几列",然后沿着那个方向做点积,最后把结果写回全局内存。

轨迹日志的每一行就是一个时钟周期,你能同时看到 4 个线程各自的当前指令、程序计数器 PC 和寄存器取值。这正是 SIMD 执行在硬件上的样子:同一条指令,作用在各自的数据上。区别来自每个线程寄存器堆里几个只读寄存器——%blockIdx%blockDim%threadIdx,内核靠它们算出各自负责的地址。

这种结构就是两级并行模型:线程是最小执行单位,若干线程打包成一个块(Block),GPU 里的调度单元按"块"为单位分发工作。tiny-gpu 的取舍很明确——每个核心一次只处理一个块,跑完才接下一个新块。这牺牲了一些吞吐量,换来的是控制逻辑极其简单,每一行轨迹你都能看懂。

16 位指令到计算结果:极简 ISA 与六阶段流水线

打开黑盒,先看指令集。tiny-gpu 一共只有 11 条指令,每条固定 16 位,按用途分四类,每类一句话就能说清:

  • 内存读写LDR/STR负责从全局内存搬数据进寄存器、再把寄存器写回去,矩阵元素的每一次访问都走这里;
  • 算术运算ADDSUBMULDIV,由 ALU(算术逻辑单元)执行,矩阵乘法的乘和加全靠它们;
  • 比较与跳转CMP比较两个寄存器并把结果状态存起来,BRnzp据此决定是否跳回别的行——矩阵乘法里k < N的循环就是这么实现的;
  • 立即数CONST把一个常量直接塞进寄存器,不用碰内存。

寄存器用 4 位编号,总共 16 个:前 13 个随便读写,最后 3 个是只读的线程身份寄存器,SIMD 的"各自为政"就靠它们。

一条指令进来后,走的是一条六站装配线:

  1. FETCH(取指):按 PC 从程序内存取走 16 位指令;
  2. DECODE(译码):解析出操作码和操作数,变成控制信号;
  3. REQUEST(请求):如果是内存指令,向内存控制器发请求;
  4. WAIT(等待):等外部内存应答——只有内存指令真的会停在这,其他指令快速通过;
  5. EXECUTE(执行):ALU 完成运算;
  6. UPDATE(更新):结果写回寄存器堆。

六站串行、一条指令走完再走下一条,是刻意设计的:先看清每一步在干什么,后面谈流水优化才有对比。

计算核心里有什么:ALU、调度器与参数化线程数

把视角拉到整机。一次内核启动的流程是:内核代码装进程序内存,数据装进数据内存,设备控制寄存器里写入线程总数,然后拉高 start 信号。之后由分发器把线程组织成块、派发给空闲的核心,全部完成后回报 done。

整台 GPU 由这几块组成:设备控制寄存器(存"这次要发多少线程")、分发器、可配置数量的计算核心(默认 2 个)、数据/程序内存各自的内存控制器(负责按带宽节流请求并转交响应),以及一个规划中的缓存。内存本身很小:8 位地址意味着 256 行,数据位宽 8 位、程序位宽 16 位。

每个核心内部再往下拆:取指器和译码器是全线程共享的一套,而每个线程独享一个 ALU、一个 LSU(负责内存请求的收发)、一个寄存器堆和一个 PC。关键设计在于线程数是参数THREADS_PER_BLOCK(默认 4)——改一个参数就换一种核心规格,而不是重新画电路,这让同一个设计可以拿来对比不同并行度。核心里只有一个调度器,它按块串行地驱动所有线程同步步进。这就是前文说的取舍:牺牲部分吞吐量换硬件极简,恰好是学 GPU 架构教程式理解的最好切面。

从"能跑"到"更快":极简 GPU 的六条改造清单

读到这里,你已经知道它"缺什么"了。生产级 GPU 的优化大致落在这六个方向,每一条都是这个项目留出的练手空间:

性能侧

  • 多级缓存:把单层缓存扩成 L1/L2 层次,让高频数据离计算单元更近;
  • 内存合并:把相邻线程的连续地址请求合成一笔事务,省掉重复寻址开销;
  • 指令流水:不等上一条完全跑完就放行下一条,掩盖内存等待的空转。

功能侧

  • 分支发散:允许同一批线程跳到不同 PC,放弃"每条指令后必然汇合"的假设;
  • 共享内存:给块内线程开一片公共存储,交换中间结果不再绕道全局内存;
  • 图形功能:加一点基本的光栅化或纹理硬件,让这台极简 GPU 也碰一碰图形负载。💡

资源速查:从 README 到调度器、译码器入口

  • 完整文档:README.md,架构、ISA、内核汇编与仿真说明最全的一手资料;
  • 计算核心顶层:src/core.sv,看共享/独享资源如何接线;
  • 矩阵乘法测试脚本:test/test_matmul.py,对照日志验证输出矩阵;
  • 内核程序镜像:gds/,两个内核编译后的二进制都在这里;
  • 想改调度策略:入口在 src/scheduler.sv,块级批处理逻辑就在这个文件里;
  • 想加新指令:从 src/decoder.sv 的译码控制信号入手。

建议的动手路线:先跑通仿真,再改一个参数(比如线程数)重跑一次对比轨迹,最后挑上面清单里的一条实现掉——这台不到 1300 行的极简 GPU,就是为这种"拆了再装回去"的学习方式准备的。

【免费下载链接】tiny-gpuA minimal GPU design in Verilog to learn how GPUs work from the ground up项目地址: https://gitcode.com/GitHub_Trending/ti/tiny-gpu

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/13 9:42:24

hyperframes多义详解:从EtherCAT工业帧到高帧率拍摄

“hyperframes”这个词&#xff0c;最近不管是在技术社区还是短视频创作圈&#xff0c;搜索热度都明显上来了。但有意思的是&#xff0c;不同圈子的人搜这个词&#xff0c;想找的东西完全不是一回事。搞工业自动化的&#xff0c;脑子里是 EherCAT 报文里那种一帧跑遍所有从站的…

作者头像 李华
网站建设 2026/9/13 9:42:20

SpringBoot整合Knife4J实现高效API文档管理

1. SpringBoot项目整合Knife4J概述 在前后端分离的开发模式下&#xff0c;API文档的重要性不言而喻。作为Java开发者&#xff0c;我们经常需要在SpringBoot项目中集成API文档工具。Knife4J作为Swagger的增强方案&#xff0c;提供了更强大的文档展示和调试功能。我最近在一个电商…

作者头像 李华
网站建设 2026/9/13 9:42:07

superpowers技能包:让Codex CLI从随机写代码变成按流程施工

最近一直在折腾 Codex CLI&#xff0c;顺手把 GitHub 上很火的 superpowers 技能包装上了。用了两周&#xff0c;最大的感受是&#xff1a;它把 AI 写代码这件事从"随机炼丹"变成了"按流程施工"。如果你也在用 Codex CLI、Claude Code 这类编程智能体&…

作者头像 李华
网站建设 2026/9/13 9:42:06

C++编译期数组操作:原理、实现与性能优化

1. C编译期数组操作的核心价值在C开发中&#xff0c;数组是最基础的数据结构之一。传统运行时数组操作会带来性能开销&#xff0c;而编译期数组操作&#xff08;Compile-time Array Manipulation&#xff09;则能在代码编译阶段完成数据处理&#xff0c;实现零运行时开销。这种…

作者头像 李华