GPU 基础介绍

该篇介绍主要以 AMDGPU 7900XTX (Navi31) 为例。

现代 GPU 上基本使用 SIMT (单指令多线程, Single Instruction Multiple Threads) 模型,即一条指令执行在多个线程 (thread / lane / invocation) 上,每个线程上可能存储、运算不同地数据,也就是说具有大规模并行计算的能力。

How To Use Mesa's test tool: deqp-runner

deqp-runner is a series of tools written by mesa developers for running vulkan and opengl quality test case programs. It can run in parallel and robustly dEQP (draw-element quality program), piglit, SkQP (Skia Quality Program), and so on.

In my experience, when running large dEQP test cases, your own changes may cause umd (user mode driver) to fail, crash, timeout, or hang. If you simply use deqp-vk, the khronos testcases program for vulkan, the test will stop when umd throws unrecoverable error. And we cannot easily get the results that new failures based on the previous version.

How To Build Mesa for AMD

copy from Wikipidia:

Mesa is an open source implementation of OpenGL, Vulkan, and other graphics API specifications. Mesa translates these specifications to vendor-specific graphics hardware drivers.

Mesa is UMD (User mode driver), provides implementation of graphics API and shader compiler. Mesa is like a mono repository, different vendor drivers and graphics APIs are in different directories.

Gallium is a driver project in mesa, includes many backends for hardwares:

  • AMD driver for GCN & Navi (radeonsi)
  • Intel driver for iris (i965)
  • Intel driver (i915)
  • Nvidia driver (nouveau)
  • Software implementation (swrast)
  • OpenGL over Vulkan (zink)
  • DirectX3D 12 driver (d3d12)
  • OpenCL frontend (clover)
  • new OpenCL frontend by rust (rusticl, 23.1)

libgl only provides APIs, and dispatch call to vendor implementation (e.g. radeonsi).

图结构

Graphs stand or fall by their choice of nodes and edges.

— Watts & Strogatz

信息
对于图的学习推荐使用 Rocs。什么?你说你是 Windows?那也不知道用什么啊,欢迎推荐其他工具。另外,KDE 天下第一!

图 (graph) 是有序对 \(G = (V, E)\),其中 V 是点集 (Vertex),点的个数用 \(\lvert{V}\rvert\) 表示;\(E \subseteq \{ \{ x, y \}: (x, y) \in V^{2}, x \ne y \}\) 是边集 (Edge),边的个数用 \(\lvert{E}\rvert\) 表示。如果点对是有序的,那么这个图称为有向图 (directed graph / digraph)。当然有向图的边,如果去掉方向限制所对应的无向图,称为该有向图的基础图 (underlying graph)。有时边还有一个属性称为权重 (weight),表示使用这条边的代价 (cost)。如果任意两个顶点之间都有一条边的话,那么这个图被称作完全图 (complete graph)。

控制流、递归、高阶函数

解释器所执行语句来执行某些操作。

比如这整个复合语句 (compound statement),在 Python 中由 def 声明;标头 header 确定了一个简易语句 (clause) 的类型,这个语句中跟随了一个语句序列 (suite)。解释器会按一定顺序执行这个语句序列。

优化简介

上世纪 80 年代早期优化在编译器开发中还是一个可选特性,一般在其他部分都完成后才会添加到编译器中。因此出现了调试编译器优化编译器的区别,即前者强调编译速度,因此可执行代码与源码之间存在较强的对应关系;后者强调最小化或最大化可执行程序的某些属性。因此优化编译器会花费更多时间来编译,生成质量更好的代码,通常这个过程伴随着大量移动操作,使调试变得困难。

中间表示

编译器通常组织为一连串的处理 pass,在每两个 pass 之间需要将已知的所有信息进行传递,因此编译器需要中间表示 (IR, Intermediate Representation) 表达信息。IR 在编译器中可能是唯一的,也可能有多种。在转换期间,编译器不会回头查看源代码,而是只观察 IR,因此 IR 的性质对编译器对代码的处理由决定性影响。

内存对齐

众所周知,运行的程序是需要内存占用的,在编码时假定栈上的空间是连续的,且定义的所有变量都连续分布在栈上。

实际上,虽然变量是连续分布在栈上的,但编译器会根据不同类型与对齐方式,将变量重新排列,达到最优情况。