十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

一条 make 命令跑通的 tiny-gpu:极简 GPU 架构拆解与仿真实录

一条 make 命令跑通的 tiny-gpu:极简 GPU 架构拆解与仿真实录 一条 make 命令跑通的 tiny-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-gputiny-gpu 是一个用 Verilog 描述的极简 GPUGraphics Processing Unit图形处理器12 个源文件、11 条指令、约 1500 行代码目标是让GPU 硬件到底怎么工作这件事第一次变得可以通读。商业 GPU 的低层细节几乎全部封闭开源方案又往往追求功能完备而难以入门这个项目把图形渲染全部砍掉只保留 GPGPU通用并行计算最核心的几样东西一条 16 位指令、一个两核的并行执行阵列、一套块/线程两级调度。这篇文章以一次真实的矩阵乘法仿真为主线把取指、译码、访存、写回的每个周期拆开给你看。一条 make 命令跑出的最小 GPU 仿真先说清楚它跑起来需要什么。依赖只有三样iverilogIcarus Verilog开源 Verilog 编译器、cocotbPython 驱动的硬件测试框架、sv2v把 SystemVerilog 转成普通 Verilog 的工具因为 iverilog 不识别 SV 语法。Makefile 里test_matmul这一个目标把整条链路串起来了先用 sv2v 把src/下 12 个 .sv 文件逐个转换并拼进build/gpu.v再用 iverilog 编译出sim.vvp最后由 cocotb 加载test/test_matmul.py驱动仿真。下面这条命令会完整执行转换 → 编译 → 仿真三步make test_matmul跑通后应能看到 cocotb 打印test_matmul ... PASS随后日志里出现Completed in N cyclesN 是实际消耗的时钟周期数全部执行轨迹写入test/logs目录。矩阵加法内核同理换成make test_matadd即可。16 位指令里藏着一台 SIMD 机器tiny-gpu 的指令固定 16 位最高 4 位是操作码往下 4 位目的寄存器 rd、4 位源寄存器 rs最低 8 位兼作立即数和 NZP 条件。操作码一共给了 11 条指令——ADD/SUB/MUL/DIV四则运算LDR/STR读写全局内存CMP比较并把负/零/正结果写进 NZP 状态位BRnzp依据 NZP 跳转CONST装立即数RET标记线程结束外加一个NOP。寄存器表是理解并行模型的关键R0~R12 是 13 个自由读写寄存器R13~R15 是三条只读寄存器分别固定为%blockIdx块编号、%blockDim每块线程数、%threadIdx线程在块内编号。同一套指令、同一组控制信号因为这三个值不同而作用在 4 份不同数据上——这就是 SIMDSingle Instruction Multiple Data单指令多数据在硬件上的全部秘密。译码逻辑集中在 src/decoder.sv它只干一件事把 16 位指令拆成寄存器写使能、内存读写使能、ALU 运算选择等 10 个控制信号。操作码与位段速查指令操作码作用BRnzp0001按 NZP 条件跳转实现循环与分支CMP0010比较两个寄存器结果写入 NZPADD~DIV0011~0110四则运算结果写 rdLDR/STR0111 / 1000按寄存器中的地址读写全局内存CONST1001把低 8 位立即数装入寄存器RET1111线程执行完毕取指到写回一个核心的 6 拍状态机scheduler.sv 定义了核心的 7 个状态其中IDLE之外是真正干活的前 6 级FETCH从程序内存取当前 PC 处的指令DECODE译码REQUEST发出访存请求WAIT等所有 LSULoad-Store Unit负责访存的部件回数据EXECUTE执行 ALU 运算UPDATE把结果写回寄存器并更新 PC。这张状态图值得停下来看DECODE、REQUEST、EXECUTE、UPDATE各占恰好 1 个周期只有FETCH和WAIT是异步等待——也就是说一条LDR指令至少消耗 6 个周期而一条ADD固定 6 个周期。调度器在WAIT阶段会轮询全部 4 个线程的 LSU 状态只要有一个还在请求中就不前进。指令不流水线化每条指令等整块线程执行完再取下一条这是为可读懂性主动做的取舍。核外的另外两个角色dispatcher块分发器算出总块数ceil(thread_count / 4)每有核复位完成就派出下一个块并在最后一块完成后拉高顶层done信号controller.sv内存控制器则管理 4 条数据内存通道和 1 条只读的程序内存通道轮询所有消费者、逐个放行请求、把内存应答转发回对应的 LSU 或取指单元。2 个核共 8 个 LSU 并发打 4 条通道请求必然排队——外部内存带宽有限而内部请求过量这个核心矛盾在这 12 个文件里被完整保留了下来。4 个线程如何并行算出 C 矩阵矩阵乘法内核在 test/test_matmul.py 里以 27 条 16 位二进制机器码的形式写入程序内存对应的汇编逻辑是这样的节选循环体MUL R10, R6, R2 ADD R10, R10, R9 ADD R10, R10, R3 ; addr(A[i]) row * N k baseA LDR R10, R10 ; 从全局内存载入 A[i] MUL R11, R9, R2 ADD R11, R11, R7 ADD R11, R11, R4 ; addr(B[i]) k * N col baseB LDR R11, R11 ; 载入 B[i] MUL R12, R10, R11 ADD R8, R8, R12 ; acc acc A[i] * B[i]这段代码在干什么每个线程用%threadIdx算出自己负责的输出元素位置row i / N、col i % N再跑一个CMPBRn组成的循环把 A 的行和 B 的列做点积最后STR写回 C。SIMD 在这里体现得很直白4 个线程各有一套私有寄存器堆、ALU、LSU、PC但共用同一条译码出的控制信号。线程 0 算 C[0][0]线程 1 算 C[0][1]线程 2、3 依次算下一行——同一拍里 4 份 ALU 各算各的。循环里每条LDR都会让 4 个 LSU 同时向内存控制器发出请求由控制器在 4 条通道上排队转发这正是真实 GPU 中访存延迟掩盖问题的一个最简版本。从仿真日志验证矩阵乘法结果测试脚本本身就是一个逐步验证的过程装程序内存、装数据内存、写入线程数、拉高start然后逐周期推进并格式化打印每个线程的 PC 与寄存器直到done拉高最后直接断言数据内存的最终状态matrix_a [data[0:2], data[2:4]] # A [[1,2],[3,4]] matrix_b [data[4:6], data[6:8]] # B [[1,2],[3,4]] expected [7, 10, 15, 22] # C A x B for i, expected in enumerate(expected): result data_memory.memory[i 8] assert result expected这段断言在干什么它不信任仿真跑完了这件事而是逐地址核对 C 矩阵落在内存 8~11 的四个字节是否等于 7、10、15、22。全过说明从取指到写回的整条通路逐位正确。上面这张轨迹截图就是日志的可视化形态每一行一个周期列出了各线程当前执行的指令、PC、寄存器值和 LSU 状态两条LDR之间的WAIT停顿清晰可见。你也可以自己翻日志ls -t test/logs/ | head -3应看到刚生成的log_YYYYmmddHHMMSS.txt。文件开头是数据内存初始态两个 2x2 矩阵结尾是最终态中间夹着完整的逐周期轨迹。从极简原型走到真实 GPU 硬件tiny-gpu 在 README 里自己列好了升级路线图也是最有价值的延伸阅读方向给取指单元加指令缓存当前每次FETCH都打程序内存、用流水线让下一条指令的取指与上一条的执行重叠、引入 warp线程束调度让核内并发多个线程批次、支持分支发散管理。前三个分别对应 README.md Advanced Functionality 一节里的 Cache、Pipelining、Warp Scheduling。建议的阅读顺序先通读 README 的 Architecture 与 Execution 两节建立整体印象再按dispatch.sv→scheduler.sv→core.sv→controller.sv的路径读源码前三个文件不到 200 行就能全部消化。想继续深入开源 GPU 硬件Miaow 和 VeriGPU 两个项目是功能更完备的参照物——tiny-gpu 相当于它们的最小可运行切片。把 2 核改成 4 核、把线程数从 4 提到 8只需要改gpu.sv顶部的两个参数这本身就是理解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),仅供参考
返回列表