ARTICLE DETAIL

资讯详情

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

12 个 Verilog 文件搭出可仿真 GPU:tiny-gpu 从跑通到读懂的教程

12 个 Verilog 文件搭出可仿真 GPU:tiny-gpu 从跑通到读懂的教程 12 个 Verilog 文件搭出可仿真 GPUtiny-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两个 2×2 矩阵、4 个线程一次内核就算完整个矩阵乘法。这是 tiny-gpu 的日常场景一个用 Verilog 写成的最小 GPGPU能在仿真里跑矩阵加法、乘法内核并逐周期打印执行轨迹。我们走的路径和常见架构阅读相反——先跑仿真看结果再钻进 12 个 Verilog 模块里。跑起来3 条命令跑通矩阵乘法仿真仿真需要三样工具iverilogIcarus Verilog 编译器、cocotb 测试框架、sv2vSystemVerilog 转 Verilog 的转换器README 的 Simulation 一节有安装指引。前两者走常规包管理器安装即可。git clone https://gitcode.com/GitHub_Trending/ti/tiny-gpu brew install icarus-verilog pip3 install cocotb进入仓库后建好构建目录触发 Makefile 里的测试目标mkdir build make test_matmul测试会在test/logs下写一份日志文件开头是初始内存状态两行 2×2 矩阵 [1,2,3,4] 并排放着结尾是最终状态乘积 [7,10,15,22] 落在地址 8~11。中间是逐周期执行轨迹——每个核心、每个线程每拍执行了什么指令、PC 和寄存器是什么值全被记录。看内部数据像快递一样被分拣把整台机器想象成快递站。内核是一张订单线程是包裹调度器dispatch负责把包裹按 4 个一箱打成 block再整箱交给空闲的核心core——一箱只派一次车不混装。数据流转分四段装载指令进程序内存16 位一条共 256 行数据进数据内存8 位一个内核的线程数写进 DCR设备控制寄存器。派送start 信号拉高后DCR 交出线程总数dispatch 把它切成 block分发给 2 个核心。执行核心里每个线程都有一整套私人装备——ALU做算术、LSU访存、PC程序计数器、寄存器堆大家执行同一条指令、各算各的数据。这就是 SIMD一条指令同时算多个数的硬件形态。回传核心发出的访存请求要过内存控制器它有固定数量的通道数据内存 4 条、程序内存 1 条像限行车道一样限速放行再把响应转回发起线程。为什么这么设计一切为了看得清。一次只跑一个内核、核心一次只处理一个 block、线程不允许分支发散每条指令后都回到同一 PC、缓存标注为开发中——每砍一刀都在 README 里留了可扩展的锚点。拆解关键模块三个文件讲清 8 成机制读懂 scheduler.sv 的六段状态机输入是三样start 信号、译码器控制信号、取指器与各线程 LSU 的当前状态。处理是一套八状态 FSMIDLE 等启动FETCH 等指令取回DECODE、REQUEST 各占一拍WAIT 是唯一可能卡住的阶段轮询直到没有任何 LSU 还在等内存响应访存是异步的其余步骤全部一拍过EXECUTE 跑 ALU 与 PC 运算UPDATE 写回结果遇到 RET 就进入 DONE 并拉高 done。输出是 core_state告诉外部核心此刻在哪一步、当前 PC 和 done 信号。妙处在 WAIT它不是睡死等待而是轮询即放行——调度器只看所有 LSU 是否都脱手脱手立刻推进。异步内存延迟就这样被同步状态机吸收掉了。文件src/scheduler.sv读懂 decoder.sv 的 11 条指令输入是一条 16 位指令和 core_state译码器只在 DECODE 拍动作。高 4 位是操作码全部 11 条指令都在里面BRnzp按 NZP 标志条件跳转、CMP比较、ADD/SUB/MUL/DIV四则运算、LDR/STR取数/存数、CONST灌立即数、RET线程退出。低 12 位切成源/目的寄存器号各 4 位共 16 个寄存器、立即数和分支条件。输出不是理解而是一组 0/1 控制信号寄存器写不写、内存读不读、ALU 选哪种运算、下一拍 PC 从哪来。其中 R13~R15 只读分别放着 %blockIdx、%blockDim、%threadIdx——同一条指令靠这三个值让每个线程算到自己的那份数据。文件src/decoder.sv读懂 gpu.sv 的内核启动顶层 gpu 是参数化拼装NUM_CORES 默认 2THREADS_PER_BLOCK 默认 4数据内存 4 条读写通道。启动链路只有一条线DCR 交出线程数 → dispatch 切块派核 → 各核心调度器把 block 跑完报 DONE → done 拉高。核心的私人装备来自 src/core.sv 里按线程数生成的实例化——每个线程的寄存器堆、PC、ALU、LSU 都是实体硬件不是分时复用。这也是它能真并行的原因4 个线程同一拍里真的在算 4 份数据。文件src/gpu.sv折腾指南改什么、会怎样换派送策略src/dispatch.sv里把 block 到核心的分配方式从顺序改为轮询。效果两个核心分单更均匀轨迹日志里能直接对比两种策略的活跃周期。压状态机src/scheduler.sv里给非访存指令跳过 WAIT。效果每条 LDR/STR 之外的指令少等一拍日志尾部的 Completed in N cycles 数字变小。调并行度src/gpu.sv把 NUM_CORES 从 2 改成 4。效果8 线程内核从 2 个 block 变 1 个周期数下降而 matmul 只有 1 个 block加核毫无收益——这恰好是block 是调度单位最直观的证明。一句话收束与资源入口tiny-gpu 把 GPGPU 压缩成一次能读完的 12 个文件快递分拣、六段状态机、11 条指令译码加上可跑的矩阵乘法仿真就是理解GPU 如何执行一条指令的最短路径。整体架构、内核源码与进阶方向README.md矩阵乘法仿真脚本含 27 条指令的机器码表test/test_matmul.py计算核心顶层模块src/core.sv【免费下载链接】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),仅供参考
返回列表