最近在看《黄仁勋:英伟达之芯》,这本书讲述了英伟达是如何一步一步优化GPU,感觉创业不易,不过本文为了让大家更好了解GPU,所以简单汇总了一些知识点。
作为程序员都知道我们现有的程序包括两种类型:
def sequential_calculation():
a = 0
b = 1
for _ in range(1000):
a, b = b, a + b
return b
从上面代码看出,a和b的计算是相互依赖的,这段代码是没法直接改为并行执行。
def parallel_multiply():
numbers = range(1000)
results = []
for n in numbers:
results.append(n * 2)
return results
并行是可以让多个程序同时执行,比如上面的代码,由于results每个元素的结果是独立的,可以让numbers的每个元素独立计算,不需要依赖顺序。
从广义上讲,GPU更适合处理并行代码,CPU更适合处理顺序代码,由于CPU是大核,比如apple的M3芯片有8个CPU,而GPU是小核,比如英伟达的 A100
有5120个核心。
GPU拥有数千个简单的核心,可以同时对不同的数据执行相同的操作,所以GPU对于简单的并行计算是非常快的,比如矩阵运算,图像处理,渲染视频游戏图形,深度学习等。其中渲染视频游戏图形就是许多简单重复计算,在你玩游戏的过程中,像素实际是一个矩阵,如果每一帧需要重新渲染,实际可以利用数千核同时计算,这就是为什么GPU在游戏渲染上非常快。
CPU
想象成忙碌餐厅厨房里的厨师,厨师可以独立完成很多事情:
VIP
客人有特殊饮食要求时,立即调整烹饪计划相比之下,GPU
核心就像一百名擅长重复性任务的助手,他们可以在几秒钟内切好洋葱,但无法有效地管理整个厨房,如果你要求 GPU
处理不断变化的晚餐服务需求,它会很吃力。
FLOPS
即每秒浮点运算次数,衡量处理器每秒可以对十进制数执行多少次数学计算,它对于科学模拟、人工智能训练和图形渲染等任务尤为重要,单位如下:
浮点运算是指对浮点数执行的数学计算,包括:加法和减法,乘法,除法,平方根,指数和对数等。 每一个都算作一次浮点运算,因此,当我们看到 NVIDIA A100 GPU
的"9.7 TFLOPS"之类的数字时,这意味着理论上它每秒可以执行 9.7
万亿次这些基本运算。
您可能会看到有关 GPU
性能的浮点精度讨论:
例如:A100 GPU
对于 64
位双精度为 9.7
TFLOPS,对于 32
位单精度为 156
TFLOPS。
为什么存在不同的精度,主要考虑计算的性能和存储大小:
通常对于视频游戏通常使用单精度,而科学模拟可能需要双精度(包括现在的大模型计算)。
NVIDIA GPU架构主要由几个模块组成:
GPU
从上图中可以看出 GPU
主要由许多的 SM
组成,SM
全称为Streaming Multiprocessor
流式多处理器,是NVIDIA GPU
架构中的重要组成部分,也是 GPU
的基本计算单元。每个 SM
由多个 CUDA
核心、纹理单元、Tensor Core
、流控制器和存储器等辅助单元组成,可以同时执行多个计算任务,并具有高度的灵活性和性能。
(1)https://codingstuff.substack.com/p/if-gpus-are-so-good-why-do-we-still