基于FPGA的图形加速器实现:FPGA-GPU项目日志

  • ~10.21K 字

导言

在互联网上,我们能够找到数不胜数的有关手搓CPU的项目资料,甚至有大佬为此出版专门的教程,但很少能够看到有关GPU的资料。

本次项目旨在通过参考网上上少有的资料,基于FPGA(现场可编程门阵列)实现一个寄存器传输级(RTL)的图形加速器,即显卡或GPU(Graphics Processing Unit)。当然,商业级的显卡与单纯的GPU芯片并不是同一个概念,我们的目标仅仅只是设计一个能够加速图形渲染速度的IP核(Intellectual Property Core)

项目主要分为两个阶段:模板复现功能扩展

在模板复现阶段,我们将根据知乎文章从零开始制作一个属于你自己的GPU | 基于FPGA的图形加速器实现原理的指导复现出其中的图形渲染场景。

Let’s begin our journey!


项目名称:FPGA-GPU

项目成员:virtualguard_C

项目指导:vigosser_L

项目核心参考:从零开始制作一个属于你自己的GPU | 基于FPGA的图形加速器实现原理

项目核心参考代码仓库:PainterEngine


复现阶段

预备阶段


  • 提出项目,验证可行性
  • 收集相关理论资料
  • 预备开发环境

第0周(2025.3.15-16)

2025.3.15晚:
2025.3.16:
  • 第一次线下交流,确定方向

  • 通过直接询问核心参考文献作者(以下简称作者)及ai查询相结合的方式,解决C项目在linux系统上(Ubuntu22.04)的编译配置问题(Makefile配置),成功复现上层C语言层面的软渲染器实现。具体配置如下:

winodws系统配置和其他具体过程这里不再赘述,详情可参考原文,这里只说明在linux上的编译配置。

创建独立的项目目录,并将软渲染实现的c源码从克隆或解压缩后的源项目路径复制过来:

1
2
3
mkdir -p workspace
cd ./workspace
cp /path/to/PainterEngine/platform/fpga_gpu/simulator/* .

复制Makefile并进行修改:

1
2
cp /path/to/PainterEngine/platform/linux/makefile .
code ./makefile

Makefile配置如下: - code_01

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#gcc freeglut makefile
#####################################################
target :=painterEngine
project_path := /path/to/workspace
painterengine_path := /path/to/PainterEngine/
#####################################################
project_build := $(wildcard $(project_path)/*.c)
project_build_cpp = $(wildcard $(project_path)/*.cpp)

project_build_o := $(patsubst %.c,%.o,$(project_build))
project_build_o += $(patsubst %.cpp,%.o,$(project_build_cpp))

painterengine_build_core := $(wildcard $(painterengine_path)/core/*.c)
painterengine_build_painterengine_o := $(patsubst %.c,%.o,$(painterengine_build_core))

painterengine_build_kernel := $(wildcard $(painterengine_path)/kernel/*.c)
painterengine_build_painterengine_o += $(patsubst %.c,%.o,$(painterengine_build_kernel))

painterengine_build_runtime := $(wildcard $(painterengine_path)/runtime/*.c)
painterengine_build_painterengine_o += $(patsubst %.c,%.o,$(painterengine_build_runtime))

painterengine_build_platform := $(wildcard $(painterengine_path)/platform/linux/*.c)
painterengine_build_painterengine_o += $(patsubst %.c,%.o,$(painterengine_build_platform))

painterengine_build_platform := $(wildcard $(painterengine_path)/platform/linux/*.cpp)
painterengine_build_painterengine_o += $(patsubst %.cpp,%.o,$(painterengine_build_platform))

all:$(project_build_o) $(painterengine_build_painterengine_o)
gcc $(project_build_o) $(painterengine_build_painterengine_o) \
-o $(target) \
-I "$(painterengine_path)" \
-I "$(project_path)" \
-I "$(painterengine_path)/platform/linux" \
-I "$(painterengine_path)/runtime" \
-L. -lGL -lglut -lpthread


$(project_path)/%.o:$(project_path)/%.c
gcc -c $^ -o $@ -I "$(painterengine_path)" -I "$(painterengine_path)/platform/linux" -I "$(painterengine_path)/runtime"

$(project_path)/%.o:$(project_path)/%.cpp
gcc -c $^ -o $@ -I "$(painterengine_path)" -I "$(painterengine_path)/platform/linux" -I "$(painterengine_path)/runtime"

$(painterengine_path)/runtime/%.o:$(painterengine_path)/runtime/%.c
gcc -c $^ -o $@ -I "$(painterengine_path)"

$(painterengine_path)/kernel/%.o:$(painterengine_path)/kernel/%.c
gcc -c $^ -o $@

$(painterengine_path)/core/%.o:$(painterengine_path)/core/%.c
gcc -c $^ -o $@

$(painterengine_path)/platform/linux/%.o:$(painterengine_path)/platform/linux/%.c
gcc -c $^ -o $@ -I "$(project_path)" -I "$(painterengine_path)" -I "$(painterengine_path)/platform/linux" -I "$(painterengine_path)/runtime"

clean:
find $(painterengine_path) -type f -name "*.o" -exec rm -f {} +
find $(painterengine_path) -type f -name "a.out" -exec rm -f {} +

相比较源项目需要正确修改项目路径和PainterEngine所在路径,这里我们还添加了make clean的配置。

修改完成后,务必检查路径是否配置正确,随后即可开始编译:

1
make all -f ./makefile

编译完成后,运行生成于当前路径的painterEngine可执行程序,即可成功复现原文对应内容。

第1周(2025.3.17-23)

2025.3.17
  • 开始汇总基础依赖,收集相关理论资料
    根据原文主要需要以下方面的基础知识:

1.C语言基础、verilog基础

2.计算机组成原理/计算机系统基础

3.计算机图形学基础

4.数字电路基础

5.通信原理基础

6.FPGA设计基础

  • 获取FPAG编译工具VivadoVitis

注意版本问题,最佳版本为2024.02,过老的版本会出现无法打开原文项目的问题。

另外需要注意的是,运行Vivado对设备硬件有一定需求,主要参考设备CPU的单核性能以及内存容量,内存最好在32G以上。同时,虽然Vivado存在linux版本,但安装过程相当繁琐,且极易出现兼容性问题,故不展开。

在安装过程中,需要AMD的官方账号,安装时需要的地址信息可通过美国地址生成器生成。

参考资料:

原文评论区 - resource_01

Vivado全版本下载分享 - resource_02

Vivado安装问题(linux) - resource_03

Vivado 2018.3 下载及安装 - resource_04

  • 基础概念了解

这个方式多样,需要日积月累,碎片化的概念可以通过AI和浏览器查询;也可以在一些平台上阅读一些相关的文章,反向利用大数据的推送机制。

芯片基础概念划分 - resource_05

系统性的知识体系可以通过一些书籍和课程来学习

csapp:深入理解计算机系统 -resource_06

csapp中文讲解 - resource_07

  • GPU架构开源资料(项目指导提供)

tiny-gpu | github repository - resource_08

FlexGripPlus-兼容CUDA的开源GPGPU实现简介 - resource_09

FlexGripPlus | github repository - resource_10

2025.3.18
  • 初始化项目日志

是的,就是这个你正在看的玩意

  • 获取硬件(型号ZYNQ-xc7z020clg484-1)

硬件平台是Zynq7000系列的SoC开发板, 详情参考原文

硬件详细资料 - resource_01

AMD官方文档 - resource_02

基础理论学习阶段


  • 依据预备阶段收集到的基础依赖进行基础理论学习
  • 进一步收集资料,同时进行消化

注:该阶段过程相对漫长,日志有概率不以逐周形式展开


2025.3.19
  • 准备阶段基本结束,进入基础理论学习阶段

项目复现核心概念专有名词简要解释 - resource_01

  • 软渲染器的c语言实现原理

可直接参考项目原文

从零开始制作一个属于你自己的GPU | 基于FPGA的图形加速器实现原理 - resource_02

其实就是我们在预备阶段配置的demo

相关理论基础:C语言、计算机图形学

GAMES101: 现代计算机图形学入门 - resource_03

《Fundamental Of Computer Graphics 4th Edition》(计算机图形学基础) - resource_04

《计算机图形学:原理与实践(基础版)》| 机械工业出版社 - resource_05

2025.3.20

针对【Rs-250319】,为了节约时间,我们无需全篇通读,仅需了解与项目对应的概念。

Note:此后本日志以{data(id)}-date形式指代对应日期(一般是首次)整理至此的参考文献、问题等资料,方便回溯。例如【Rs-250319】指2025.3.19的所有resource;【Q01-250325】指2025.3.25的question_01)

例如,针对《计算机图形学:原理与实践(基础版)》,我们只需迅速地通读七至十五章的内容,对计算机图形学的数学原理和基础概念与实现作个快速了解即可。

另外,由于C++面向对象的特性,图形学在编程过程中更倾向于使用C++而不是C(虽然二者在语法上差别不大),《计算机图形学:原理与实践(基础版)》中的测试实现语言也是C++,故在此整理如下参考文献:

Python to C++ Guide | CS106B - resource_01

C++ 教程 | 菜鸟教程 - resource_02

2025.3.22
  • SoC主板上电测试成功

Zynq7020-boot - image_01

Zynq7020-boot - image_02

这里采用的是测试固件二,结果标准参考硬件详细资料 - resource_01

  • 上传计算机图形学材料(🐯书原版第四版 | 文件来源:z-library

【R04-250319】的英文原版

《Fundamental Of Computer Graphics 4th Edition》 - resource_02

2025.3.23
  • 针对计算机图形学的基础概念了解基本结束

主要参考材料:【R04-250319】的第二章及第三章

需要注意的是,计算机图形学模块并非我们项目复现阶段的主要基础依赖,对其涉猎的数学基础(重心坐标系等)图形光栅化的概念有个初步了解即可。

事实上,项目原文中demo的图形渲染原理并不复杂。在复现阶段,理解三角图元是如何渲染的就足够了。在原文的demo中,三角图元的构造方法使用了最为简单的重心坐标法,【R04-250319】中对此的描述严谨且复杂,但并不利于理解————事实上,仅仅通过初中的几何知识加上向量的概念就能轻易理解重心坐标的构造过程。

  • 上传计算机系统基础材料(《csapp:深入理解计算机系统》3rd-中译版 | 文件来源:z-library

《深入理解计算机系统(原书第3版)》 - resource_01

接下来即可入本项目核心基础依赖的学习:计算机系统基础

尽管针对该基础依赖,本项目仍然只运用到其中的一小部分内容(第一章、第四章与第六章),但介于计算机系统基础在计算机学习中的重要地位,还是建议尽可能地吃透它。

针对该基础内容,该日志的前文收录了相关的官方课程与中文讲解:

官方课程:【R06-250317】

中文讲解:【R07-250317】

第二周

2025.3.24
  • 开始学习计算机系统-处理器架构

《csapp》对应章节为第一部分第三章,当然最好还是将第一部分的所有内容都消化一遍

Y86-64架构的verilog实现 | ARCH: VLOG Verilog Implementation of a Pipelined Y86 Processor - resource_01

Verilog 快速上手笔记 | Hello-FPGA - resource_02

2025.3.25
  • 参考硬件工程资料

FPGA vs ASIC - resource_01

FPGA基础 -resource_02

Vivado2024.02工程参考 - resource_03

另外在vivado内部也有示例工程可供参考, 在进入vivado的主页面选择Open Example Project即可

在官方网站也有相对完善文档及交流社区(甚至还有中文社区,他真的,我哭死):

设计概述 | AMD技术信息门户网站 - resource_04

电源管理 | AMD技术信息门户网站 - resource_05

启动和配置 | AMD技术信息门户网站 - resource_06

调试 | AMD技术信息门户网站 - resource_07

Note:需要注意的是,中文的文档通常翻译自官方文档,因此可能存在时效性问题,最好的解决方法还是查阅官方文档。

另外,【R01-250318】中;整理了大量教学性的工程(实验)示例供我们参考(但是开发环境的版本不同,有些地方仍需自行探索)。

  • 第一次【全】黑盒复现失败

在对底层原理与工程化流程均不了解的情况下,外加开发环境的版本问题,成功率自然低得可怜。用人话来说就是P都不懂就xjb乱搞😢

  • 第二次【全】黑盒复现失败,停止黑盒测试,转向工程化流程学习

工程化流程学习优先参考【R01-250318】

  • 通过工程化流程学习发现当前环境存在的致命问题

初步判定为当前环境缺少vitis硬件平台编译工具(虽然有个和vivado共存的叫“vitis”的IDE),尝试通过官方下载程序将其升级为vitis - error_01

Vitis: Installs Vitis Core Development kit for embedded software and application acceleration development on Xilins platforms. Vitis installation includes Vivado Design Suite. Users can also install Vitis lodel Composer to design for AI Engines and Programmable Logic in HATLAB and Simulink.

Vivado: Includes the full coplement of Vivado Design Suite tools for design, including C-based design with Vitis High-Level Synthesis, implementation, verification and device programming, Complete device support, cable driver, and Document Navigator included. Users can also install Vitis Model Composer to design for AI Engines and Programable Logic in HATLAB and Simulink

  • 参考GPU数据传输技术(DDR与GDDR)

内存与显存的区别 - resource_08

Note:对复现阶段乃至整个项目而言,该资料的参考价值都是极高的,对其内容的理解直接影响到对复现阶段结果底层原理的理解

2025.3.26
  • 参考显卡/GPU工作原理及体系结构

计算机组成原理——GPU图像处理器 | 云物互联 - resource_01

Note:相较【R08-250325】,这份资料更像是其视频内容的文本化,但对GPU的介绍更加全面,说【R08-250325】是它的子集或许更加贴切

另外需要注意的是,虽然在大多课堂中对GPU的工作原理现有提及,但对GPU体系结构的学习建立在计算机组成原理/体系结构的基础之上

  • 否定【E01-250325】的初步判定

错误根源并非初步判定所述版本问题,或不止这一个问题

  • 【E01-250325】解决遭遇瓶颈

开展第一次线上会议,仍未解决该问题,现在此详细描述该问题:


错误编号:E01-250325

错误简述:在vivado工程构建完成,点击Export Hardware生成.xsa文件后,启动vitis时无Create Platform Component选项可供选择,无法将已经通过vivado完成并导出的硬件设计文件正确加载至vitis进行进一步完善并写入硬件

错误复现:

1.在vivado上创建并完善一个硬件设计,随后导出.xsa硬件存档

vivado工程的创建与配置这里不再赘述,详情参考vivado 2019.2 以上带vitis 版本的简单教程演示中的第一到五步

接下来就是问题的关键所在:

根据上面的指导导出硬件后,整个工程的结构如下图所示

engine structure

通过Tools >> Launch Vitis IDE选项打开vitis,或通过点击应用快捷方式直接进入,加载后的界面如图所示

Error01_1

Error01_2

依照官方文档上文指导以及项目原文,在vitis的welcome界面上和file >> New Component选项上都应存在Create Platform Componentfile >> New Componentplatform选项)选项可供选择,但上图所示并不存在该选项


2025.3.27
  • 初步解决【E01-250325】

初步解决方案:直接更换vivado版本,2024.02 -> 2023.02,简单粗暴

同时注意在下载时勾选下图中箭头所指的选项

solution-e01-250325

  • 第三次【半】黑盒复现失败

本次黑盒测试建立在对vivado/vitis项目的工程化流程有一定了解的基础之上

失败原因:app_component模块执行built时发生致命错误,现有了解无法解决该问题

2025.3.29
  • 第四次【半】黑盒复现失败

尝试通过黑盒测试解决第三次复现致命错误的努力失败,黑盒测试中断,转向理论学习与工程代码解析,即黑盒白盒化

error

第三周

2025.4.5
  • 开始实行项目理论基础、计算机理论基础进度相互独立,二者并行推进

此举是为避免在项目遭遇工程或依赖理论学习瓶颈时在进度上牵制计算机基础理论学习,以及在后者遇到路线问题时牵制前者的推进。简单来说,就是实行计算机基础学习与项目探索在进度上的相互独立,但不干扰二者二者之间相辅相成相得益彰的关系。具体落实体现即项目探索及计算机理论基础的并行推进。

2025.4.6
  • 项目组第二次线下交流,确定当前工程瓶颈解决方向

针对项目在工程构建上遇到的瓶颈,确认问题核心在于C/C++项目工程构建问题,可通过学习Make、Cmake的使用建立对C/C++工程构建的认识

第四周

2025.4.13
  • 参考makecmake教程

Makefile Tutorial - resource_01

CMake Tutorial - resource_02

第五周

2025.4.14
  • 速通C++基础、oop特性等,为工程化学习作铺垫

在有pyton面向对象编程经验的前提下,选择合适的材料能够快速掌握cpp的各种特性

C++ Tutorial | w3school -resource_01

CS106L | Stanford University -resource_02

第五周末 - 第七周中

2025.5.1
  • 资源整合,利用docker-compose + nginx搭建个人站点

站点根域名:virtualguard{}

构建文档:docker-compose + nginx快速构建个人站点

第八周

2025.5.5
  • 继续C++基础及工程学习,同时提升C++基础学习权重

第八周 - 第十周

2025.5.22
  • C++基础主线学习基本结束

学习笔记:CS106L: C++ Fundamental

第十一周

2025.6.1
  • 第四次黑盒测试失败,初步排除CMakeLists.txt配置问题

赞助喵
非常感谢您的喜欢!
赞助喵
分享这一刻
让朋友们也来瞅瞅!