Logo

Tiny GPU: 一个用于学习GPU工作原理的最小化GPU设计

Tiny GPU:从零开始学习GPU工作原理

在现代计算机系统中,图形处理单元(GPU)扮演着越来越重要的角色。不仅在图形渲染方面表现出色,在通用计算和人工智能领域也大放异彩。然而,由于商业竞争激烈,主流GPU厂商对其硬件架构细节往往讳莫如深,这给想要深入了解GPU工作原理的开发者和研究人员带来了不小的挑战。

为了解决这个问题,一位名叫Adam Majmudar的开发者创建了Tiny GPU项目。这是一个使用Verilog实现的最小化GPU设计,旨在帮助人们从底层理解GPU的工作原理。让我们一起来深入探索这个有趣的项目吧!

Tiny GPU概述

Tiny GPU是一个极简的GPU实现,专门为学习GPU工作原理而设计。它包含了不到15个完整注释的Verilog文件,提供了完整的架构和指令集文档,并实现了矩阵加法和矩阵乘法等示例内核,同时支持内核模拟和执行跟踪。

与现代GPU相比,Tiny GPU简化了许多复杂的功能,专注于展示GPU的核心元素和基本工作原理。它主要探索以下三个方面:

  1. 架构 - GPU的整体结构是什么样的?最重要的组成部分有哪些?
  2. 并行化 - 如何在硬件层面实现SIMD(单指令多数据)编程模型?
  3. 内存 - GPU如何在有限的内存带宽约束下工作?

通过学习Tiny GPU,我们可以掌握GPU的基本工作原理,为进一步理解现代GPU中的高级功能和优化奠定基础。

Tiny GPU架构

Tiny GPU架构图

Tiny GPU的整体架构如上图所示,主要包含以下几个部分:

  1. 设备控制寄存器:存储内核执行的元数据,如线程数量等。
  2. 调度器:负责将线程分配到不同的计算核心上执行。
  3. 多个计算核心:执行具体的计算任务。
  4. 内存控制器:管理数据内存和程序内存的访问。
  5. 缓存:存储最近访问的数据,提高访问效率。

GPU执行流程

Tiny GPU被设计为一次执行一个内核。要启动一个内核,需要执行以下步骤:

  1. 将内核代码加载到全局程序内存
  2. 将必要的数据加载到数据内存
  3. 在设备控制寄存器中指定要启动的线程数量
  4. 将启动信号设置为高电平,开始执行内核

内存架构

Tiny GPU的内存系统分为数据内存和程序内存两部分:

  • 数据内存:8位寻址(共256行),每行8位数据
  • 程序内存:8位寻址(共256行),每行16位数据(对应一条指令)

内存控制器负责管理计算核心对内存的访问请求,根据实际内存带宽限制请求,并将外部内存的响应传回相应的资源。

计算核心

每个计算核心都有一定数量的计算资源,通常围绕其支持的线程数量构建。为了最大化并行性,这些资源需要被优化管理以最大化资源利用率。

在这个简化的GPU中,每个核心一次处理一个线程块,对于块中的每个线程,核心都有专用的算术逻辑单元(ALU)、加载/存储单元(LSU)、程序计数器(PC)和寄存器文件。

指令集架构(ISA)

Tiny GPU指令集

Tiny GPU实现了一个简单的11指令ISA,用于支持矩阵加法和矩阵乘法等简单的概念验证内核。主要包括以下指令:

  • BRnzp: 分支指令,用于实现循环和条件语句
  • CMP: 比较两个寄存器的值
  • ADD, SUB, MUL, DIV: 基本算术运算
  • LDR: 从全局内存加载数据
  • STR: 将数据存储到全局内存
  • CONST: 将常量值加载到寄存器
  • RET: 表示当前线程执行结束

每个寄存器由4位指定,意味着总共有16个寄存器。其中R0-R12是可读写的通用寄存器,最后3个是只读的特殊寄存器,用于提供%blockIdx%blockDim%threadIdx等SIMD关键信息。

执行流程

核心执行流程

每个核心按照以下步骤执行指令:

  1. FETCH: 从程序内存获取下一条指令
  2. DECODE: 将指令解码为控制信号
  3. REQUEST: 如果需要,从全局内存请求数据
  4. WAIT: 等待内存响应(如果适用)
  5. EXECUTE: 执行计算
  6. UPDATE: 更新寄存器文件和NZP寄存器

线程执行

线程执行图

每个核心内的每个线程都遵循上述执行路径,对其专用寄存器文件中的数据执行计算。这与标准CPU的功能非常相似,主要区别在于%blockIdx%blockDim%threadIdx值位于每个线程的只读寄存器中,从而实现SIMD功能。

矩阵运算内核

为了展示Tiny GPU的SIMD编程和执行能力,项目实现了矩阵加法和矩阵乘法两个示例内核。

矩阵加法

矩阵加法内核将两个1x8矩阵相加,通过8个独立的线程执行元素级加法。这个演示利用了%blockIdx%blockDim%threadIdx寄存器来展示SIMD编程,同时使用了需要异步内存管理的LDRSTR指令。

.threads 8
.data 0 1 2 3 4 5 6 7          ; 矩阵A (1 x 8)
.data 0 1 2 3 4 5 6 7          ; 矩阵B (1 x 8)

MUL R0, %blockIdx, %blockDim
ADD R0, R0, %threadIdx         ; i = blockIdx * blockDim + threadIdx

CONST R1, #0                   ; baseA (矩阵A基址)
CONST R2, #8                   ; baseB (矩阵B基址)
CONST R3, #16                  ; baseC (矩阵C基址)

ADD R4, R1, R0                 ; addr(A[i]) = baseA + i
LDR R4, R4                     ; 从全局内存加载A[i]

ADD R5, R2, R0                 ; addr(B[i]) = baseB + i
LDR R5, R5                     ; 从全局内存加载B[i]

ADD R6, R4, R5                 ; C[i] = A[i] + B[i]

ADD R7, R3, R0                 ; addr(C[i]) = baseC + i
STR R7, R6                     ; 将C[i]存储到全局内存

RET                            ; 内核结束

矩阵乘法

矩阵乘法内核将两个2x2矩阵相乘。它执行相关行和列的点积的元素级计算,并使用CMPBRnzp指令来演示线程内的分支(值得注意的是,所有分支都会收敛,因此该内核可以在当前的Tiny GPU实现上运行)。

.threads 4
.data 1 2 3 4                  ; 矩阵A (2 x 2)
.data 1 2 3 4                  ; 矩阵B (2 x 2)

MUL R0, %blockIdx, %blockDim
ADD R0, R0, %threadIdx         ; i = blockIdx * blockDim + threadIdx

CONST R1, #1                   ; 增量
CONST R2, #2                   ; N (矩阵内部维度)
CONST R3, #0                   ; baseA (矩阵A基址)
CONST R4, #4                   ; baseB (矩阵B基址)
CONST R5, #8                   ; baseC (矩阵C基址)

DIV R6, R0, R2                 ; row = i // N
MUL R7, R6, R2
SUB R7, R0, R7                 ; col = i % N

CONST R8, #0                   ; acc = 0
CONST R9, #0                   ; k = 0

LOOP:
  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]

  ADD R9, R9, R1               ; 增加k

  CMP R9, R2
  BRn LOOP                     ; 当k < N时循环

ADD R9, R5, R0                 ; addr(C[i]) = baseC + i
STR R9, R8                     ; 将C[i]存储到全局内存

RET                            ; 内核结束

模拟与执行

Tiny GPU提供了模拟执行上述两个内核的功能。通过运行make test_mataddmake test_matmul命令,可以模拟执行矩阵加法和矩阵乘法内核。执行模拟后,会在test/logs目录下生成一个日志文件,包含初始数据内存状态、内核的完整执行跟踪以及最终数据内存状态。

执行跟踪示例

通过查看这些日志,我们可以详细了解内核执行的每一个步骤,包括每个线程的指令执行、寄存器值变化等信息,这对于深入理解GPU的工作原理非常有帮助。

高级功能与未来展望

为了保持简单性,Tiny GPU省略了许多现代GPU中用于提高性能和功能的高级特性。这些特性包括:

  1. 多层缓存和共享内存
  2. 内存合并(Memory Coalescing)
  3. 流水线(Pipelining)
  4. 线程束调度(Warp Scheduling)
  5. 分支分歧(Branch Divergence)
  6. 同步和屏障(Synchronization & Barriers)

这些高级特性是现代GPU性能优化的关键,了解它们的工作原理对于全面掌握GPU技术至关重要。

在未来,Tiny GPU项目计划添加一些基本的高级功能,如简单的指令缓存、基本的分支分歧处理、内存合并和流水线等。此外,还计划优化控制流程和寄存器使用,以提高周期时间,并可能添加简单的图形硬件来演示图形功能。

总结

Tiny GPU项目为我们提供了一个绝佳的机会,让我们能够从底层了解GPU的工作原理。通过学习这个简化的GPU实现,我们可以掌握GPU架构的基本概念、并行计算模型、内存管理策略等核心知识。这不仅有助于我们更好地理解和使用现代GPU,还为进一步研究和优化GPU技术奠定了坚实的基础。

对于有志于深入GPU领域的开发者和研究人员来说,Tiny GPU无疑是一个极具价值的学习资源。它提供了一个清晰、简洁的GPU模型,让我们能够在不被复杂细节困扰的情况下,专注于理解GPU的核心工作原理。

如果你对GPU技术感兴趣,不妨尝试克隆Tiny GPU的代码库,运行示例内核,甚至为项目贡献新的功能。通过实际动手,你将获得更深入的理解和宝贵的经验。让我们一起探索GPU的奥秘,推动图形计算技术的进步!

🔗 Tiny GPU GitHub仓库

相关项目

Project Cover
pytorch-doc-zh
提供最新的PyTorch中文文档与教程,涵盖深度学习和张量优化,支持GPU和CPU。包括2.0版本中文翻译、最新英文教程和文档,以及丰富的学习资源和社区支持,适合希望深入了解和使用PyTorch的中文用户。
Project Cover
skypilot
SkyPilot是一个为LLMs和AI提供的框架,支持在任意云平台运行,最大化GPU利用率和降低成本。该框架通过自动管理作业队列,简化了扩展操作,还提供了对象存储的简便接入。用户可以在全球任一区域的云中自动故障转移,使用管理型Spot实例以较低成本运行,同时自动选择成本最优的机型和区域。
Project Cover
mixtral-offloading
该项目实现了Mixtral-8x7B模型的高效推理,使用混合量化和MoE卸载策略。通过HQQ量化方案分别处理注意力层和专家层,使模型适应GPU和CPU内存。每层的专家单独卸载并在需要时重新加载到GPU,活跃专家存储在LRU缓存中以减少GPU-RAM通信。更多技术细节和结果请参阅技术报告。
Project Cover
maxtext
MaxText是一个高性能、可扩展的开源大模型,采用纯Python和Jax编写,专为Google Cloud的TPUs和GPUs设计。支持训练和推理,能够从单个主机扩展到大型集群,且无需复杂优化。MaxText适用于研究和生产中的大型语言模型项目,支持Llama2、Mistral和Gemma模型,并提供详细的入门指南和性能测试结果。
Project Cover
LLM-Training-Puzzles
本项目包含8个在多GPU环境下训练大型语言模型的挑战性谜题,旨在通过实践掌握内存效率和计算管道优化的关键训练原理。尽管大多数人没有机会在成千上万台计算机上进行训练,这些技能对现代AI的发展至关重要。推荐使用Colab运行这些谜题,提供便捷的上手体验。
Project Cover
helix
Helix是一款为企业提供的私有部署人工智能平台,允许自主控制数据安全并本地部署AI技术。平台支持简便的模型微调,实现拖放操作即可完成,适合处理语言和图像模型等任务。Helix通过优化GPU内存和响应时间的权衡,为企业提供高效、可扩展的AI解决方案,特别适用于需要保持数据隐私和数据安全的场合。Helix助力企业轻松引入开源AI的顶尖技术,开启私有人工智能的应用实践。
Project Cover
WebGPT
WebGPT项目是一款基于WebGPU的Transformer模型应用,使用纯JavaScript和HTML实现。该项目不仅用于技术演示,同时也作为教育资源,支持在主流浏览器中运行,并能管理最多500M参数的模型。主要优化在Chrome v113和Edge Canary等浏览器上,通过WebGPU技术提高运行效率,适合用于学习和研究深度学习模型。
Project Cover
LLaMa2lang
LLaMa2lang提供便捷脚本,微调LLaMa3-8B模型以适应不同语言。结合RAG和翻译模型,将数据集OASST1翻译为目标语言,进行数据集成和细调,并支持推理。支持DPO和ORPO等优化方法,进一步提升模型回答质量,兼容多个基础模型与翻译架构。
Project Cover
introtodeeplearning
MIT的深度学习课程提供完整的代码和实验指导,帮助学习者自主完成实验。课程内容包括讲座视频、幻灯片及云端运行的Jupyter笔记本。实验在Google Colaboratory中运行,无需下载。课程使用mitdeeplearning Python包,简化编程过程。详细的实验提交说明和竞赛指南确保学习者掌握深度学习技能。

最新项目

Project Cover
豆包MarsCode
豆包 MarsCode 是一款革命性的编程助手,通过AI技术提供代码补全、单测生成、代码解释和智能问答等功能,支持100+编程语言,与主流编辑器无缝集成,显著提升开发效率和代码质量。
Project Cover
AI写歌
Suno AI是一个革命性的AI音乐创作平台,能在短短30秒内帮助用户创作出一首完整的歌曲。无论是寻找创作灵感还是需要快速制作音乐,Suno AI都是音乐爱好者和专业人士的理想选择。
Project Cover
商汤小浣熊
小浣熊家族Raccoon,您的AI智能助手,致力于通过先进的人工智能技术,为用户提供高效、便捷的智能服务。无论是日常咨询还是专业问题解答,小浣熊都能以快速、准确的响应满足您的需求,让您的生活更加智能便捷。
Project Cover
有言AI
有言平台提供一站式AIGC视频创作解决方案,通过智能技术简化视频制作流程。无论是企业宣传还是个人分享,有言都能帮助用户快速、轻松地制作出专业级别的视频内容。
Project Cover
Kimi
Kimi AI助手提供多语言对话支持,能够阅读和理解用户上传的文件内容,解析网页信息,并结合搜索结果为用户提供详尽的答案。无论是日常咨询还是专业问题,Kimi都能以友好、专业的方式提供帮助。
Project Cover
吐司
探索Tensor.Art平台的独特AI模型,免费访问各种图像生成与AI训练工具,从Stable Diffusion等基础模型开始,轻松实现创新图像生成。体验前沿的AI技术,推动个人和企业的创新发展。
Project Cover
SubCat字幕猫
SubCat字幕猫APP是一款创新的视频播放器,它将改变您观看视频的方式!SubCat结合了先进的人工智能技术,为您提供即时视频字幕翻译,无论是本地视频还是网络流媒体,让您轻松享受各种语言的内容。
Project Cover
AIWritePaper论文写作
AIWritePaper论文写作是一站式AI论文写作辅助工具,简化了选题、文献检索至论文撰写的整个过程。通过简单设定,平台可快速生成高质量论文大纲和全文,配合图表、参考文献等一应俱全,同时提供开题报告和答辩PPT等增值服务,保障数据安全,有效提升写作效率和论文质量。
Project Cover
稿定AI
稿定设计 是一个多功能的在线设计和创意平台,提供广泛的设计工具和资源,以满足不同用户的需求。从专业的图形设计师到普通用户,无论是进行图片处理、智能抠图、H5页面制作还是视频剪辑,稿定设计都能提供简单、高效的解决方案。该平台以其用户友好的界面和强大的功能集合,帮助用户轻松实现创意设计。
投诉举报邮箱: service@vectorlightyear.com
@2024 懂AI·鲁ICP备2024100362号-6·鲁公网安备37021002001498号