tiny-gpu:15 个 Verilog 文件看懂 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 是一个用 Verilog 写成的入门级 GPU:src/ 下 15 个硬件文件、两千余行代码,带完整的程序内存、数据内存、内存控制器和 4 线程计算核心,能跑通 2x2 矩阵乘法。
本文路线:先跑测试拿结果,再用执行轨迹倒推每个硬件单元在干什么,最后告诉你改哪个文件。
一条命令拿到 2x2 矩阵乘法结果
🚀 先获取代码并装依赖:
git clone https://gitcode.com/GitHub_Trending/ti/tiny-gpu pip3 install cocotb三个工具配合工作:cocotb 是 Python 仿真框架,iverilog 是开源 Verilog 编译器,sv2v 把 SystemVerilog 转成 iverilog 能读的 Verilog。
然后运行矩阵乘法测试:
make test_matmul日志生成在 test/logs 目录。文件开头是两块输入矩阵,都是 [[1,2],[3,4]];结尾是结果 C=[[7,10],[15,22]]——它由 GPU 里 4 个线程算出。
轨迹记录了每个周期里每个线程执行的指令和寄存器数值。后面用它讲硬件。
从执行轨迹倒推四部件硬件电路
每条指令走六步:FETCH 取指、DECODE 译码、REQUEST 请求内存、WAIT 等响应、EXECUTE 执行、UPDATE 写回。这个流程和 CPU 流水线相同,GPU 的不同在下面的硬件上。
一条 LDR 指令的完整旅程
以轨迹里的LDR R10, R10(把全局内存里的 A[i] 读进寄存器 R10)为例:
- FETCH:取指器 src/fetcher.sv 按当前 PC 从程序内存读出一条 16 位指令。
- DECODE:译码器 src/decoder.sv 解析出操作码和寄存器号,输出控制信号。
- REQUEST + WAIT:负存储单元 src/lsu.sv 发出读请求,线程挂起,直到内存控制器回数据。
- EXECUTE + UPDATE:数据落入 R10,供下一条乘法使用。
一条指令的路径,就是几个硬件单元的串联路径。
4 个线程不打架:每人一套专用硬件
核心模块 src/core.sv 用参数设定线程数:
module core #( parameter THREADS_PER_BLOCK = 4 // 每块执行的线程数 ) (核心内 4 个线程各有独立的寄存器堆 src/registers.sv、PC src/pc.sv、ALU src/alu.sv 和负存储单元。同一条指令,各线程各算各的数据——这就是 SIMD 模型。
还有个细节:每份寄存器堆里有 3 个只读特殊寄存器,存放 %blockIdx、%blockDim、%threadIdx。内核开头就用它们算出"我负责哪个元素",之后所有访存都从这个编号推导。
指令和数据如何进入 GPU
顶层 src/gpu.sv 由四块拼成:
- 设备控制寄存器 src/dcr.sv:存内核总线程数,是唯一"发射开关"。
- 调度器 src/scheduler.sv:把线程编成块(一块 4 线程),一次送一个块进核心,做完才放下一个。
- 内存控制器:全局内存带宽固定,它给各核的请求排队、按带宽限流,再把响应送回正确的线程。
- 两块独立内存:数据内存 256 行 x 8 位,存 256 以内数值;程序内存 256 行 x 16 位,每行一条指令。
11 条指令统一 16 位格式:4 位操作码、8 位立即数或操作数字段、4 位寄存器号。LDR 和 STR 负责访存,ADD、SUB、MUL、DIV 负责算术,CMP 配 BRnzp 跳转则实现了矩阵乘法内核里的 LOOP 循环。
改哪个文件:三个扩展方向
这个工程就是改着玩的,三个低门槛入口:
- 加新指令:在 src/decoder.sv 加一个 case,再扩展 src/alu.sv 的 ALU,比如按位与。
- 加缓存:多个线程重复读的数据现在每次都从内存取,在内存控制器前多插一层可明显省带宽。
- 改调度:src/scheduler.sv 现在一次只放一个块,可尝试让取指与执行重叠,这是流水线的第一步。
下一步做什么
- 跑 make test_matadd,对照加法和乘法的轨迹,看访存请求有何不同。
- 按六步状态机读一遍 src/core.sv,核对每步对应的硬件信号。
- 架构与 ISA 细节见 README.md。
【免费下载链接】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),仅供参考