news 2026/9/13 17:52:25

tiny-gpu:15 个 Verilog 文件看懂 GPU 如何并行

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
tiny-gpu:15 个 Verilog 文件看懂 GPU 如何并行

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),仅供参考

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

NocoBase 备份管理器如何对数据库与上传文件做定时备份和还原

NocoBase 备份管理器如何对数据库与上传文件做定时备份和还原 【免费下载链接】nocobase NocoBase is an open-source AI no-code platform for building business systems fast. Instead of generating everything from scratch, AI works on top of production-proven infra…

作者头像 李华
网站建设 2026/9/13 17:48:39

res-downloader 下载失败排查:从进度卡 99% 到完整走完 100%

res-downloader 下载失败排查:从进度卡 99% 到完整走完 100% 【免费下载链接】res-downloader 视频号、小程序、抖音、快手、小红书、直播流、m3u8、酷狗、QQ音乐等常见网络资源下载! 项目地址: https://gitcode.com/GitHub_Trending/re/res-downloader res-…

作者头像 李华
网站建设 2026/9/13 17:44:53

用PakePlus将网站一键打包成iOS免签App的完整指南

1. PakePlus解决的核心问题:网站到iOS免签app,差的不只是一个壳 1.1 免签app到底是个什么东西 iOS的应用分发默认走App Store,开发者要注册账号、配置签名、提交审核,等审核通过后用户才能搜索下载。这个流程对正式产品没问题&am…

作者头像 李华