当前位置: 华文星空 > 汽车

【GPU】Tesla架构(一):初识GPU架构

2022-01-14汽车

【目录】

从开天辟地到天下一统

别看副标题取得气势磅礴,但其实图形加速卡第一次拥有GPU这一试图与CPU平分秋色的名字,是在1999年。也就是说享此殊荣的GeForce 256,其实还得叫我一声哥?把坐标变换、灯光照明、三角形设置裁剪和一个每秒能处理一千万个多边形的渲染引擎集成到一个芯片上[1],是它最大的卖点。虽然这些功能现在看来由GPU负责天经地义,但是在当时,却是相当大的突破。

1999 年底,英伟达发布了 GeForce 256(代号「NV10」)。在 GeForce 256 之前,所有的显卡都被称为「图形加速器」或简称为「显卡」,但 Nvidia 选择将 GeForce 256 称为「GPU」。

大量数据执行相同操作(SIMD) ,是并行计算的最爱,也是GPU得以分家立业并不断从CPU挖墙脚的万恶之源。而GeForce 256只是这万里长征梦最开始的地方,但其大量数据具体执行什么操作是内置的(固定管线),这不还是特定算法的加速器而已么,怎配得上处理器三个字?

所以两年后,GeForce 3拥有了顶点着色器和可配置的片元管线,进入了DirectX8的时代;而第二年也就是2002年,ATI(后被AMD收购,此时应该是ATI YES?)发布了Radeon9700,其支持24位可编程的片元着色器,直接拥抱DirectX9;英伟达在2003年也发布了支持32位可编程片元的GeForce FX,虽然初始型号有点拉跨[2]。

在这个「上古混沌」时期,GPU走在一条 不断提高可编程性 的康庄大道上,而终于在2006年随着基于Tesla架构构建的第八代GeForce推出,迎来了一股小高潮。我们也迎来了本文的主角——Tesla架构。

英伟达推出了带有 Tesla 架构的GeForce 8000 系列,该架构是英伟达第一次采用统一着色器设计

在上古时期,顶点计算单元因坐标变换的需要,有着低延迟高精度数学运算的设计(能力越大责任越大,这也是为什么其在上古时期承担着更为复杂的任务,并最早实现可编程性的原因);而片元计算单元因纹理过滤的特点,则有着高延迟低精度的设计。[3]

术业有专攻,因不同的需求,有多种独立计算单元似乎理所当然。但随着GPU在可编程性上一路狂奔,两种计算单元在功能上有了越来越多的重合,就像前端工程师和后端工程师互相卷成全栈工程师,老板要考虑开掉一个一样自然(奇怪的比喻还有很多,大家权当笑谈), 顶点和片元两种计算单元终于走到了分久必合的时候

当然合并的理由不止如此。通常情况下,要处理的片元比要处理的顶点多,因此顶点计算单元和片元计算单元数量比通常是1:3。然而同样是因为GPU可编程性越来越大,两者的最佳数量比因不同的程序差异巨大,很难提前确定。(特别是DX10推出的坑爹几何着色器,谁知道程序员们会写些什么?)

工作负载越来越难以平衡,处理大三角形,顶点太闲;处理小三角形,片元太闲。以前业务功能单一,三个前端配一个后端,大家都能996,现在业务需求和模式变动频繁,难免有人要摸鱼。资本家把心一横:「招全栈工程师!」

全是「全栈工程师」的架构设计还有很多好处,现在看是只能处理顶点和片元,以后没准还能干点其他的,最好是啥都能干?以后的章节会陆陆续续提到。但现在,先让我们来仔细看看,这个距今十几年但仍魅力无限的Tesla架构。

剖开麻雀的身体

与现在动辄上万个核的3090相比,Tesla架构寒酸得让人心疼。但麻雀虽小五脏俱全,非常适合刚接触GPU架构的我们学习(直接看最新显卡的架构图,在看清楚前眼睛已经瞎了)。

而随着我们在之后的文章中一步步沿着显卡的演化路径前进到当下,我们会惊奇地发现, Tesla架构所奠定的基础设施框架,以及其所蕴含的设计思想历久弥新,从未过时

好,闲话少说,让我们掏出手术刀,开始解剖:

Tesla架构图

在细致认识这只「麻雀」的每一个器官之前,我们先来简单划分一下,有个整体的印象:

  • 最上面的是尊敬的甲方CPU;整个GPU是一个巨大的外包公司,负责干各种又脏又累的活
  • 外包公司内,最上层的是各种大小包工头;中间是一堆负责干活的社畜;最下方是堆放原料和产品的码头和仓库
  • 我们可能会发现一个特点,除了负责指挥的包工头,下面干活的社畜以及吞吐数据的码头和仓库,似乎有好几个,长得还一模一样,这就是 GPU并行性在具体硬件结构上的体现
  • 伟大的劳动人民

    接下来让我们逐一认识一下这些劳动人民:

  • Host Interface :外包公司的大包工头,负责收发来自甲方CPU的各种订单(多是枯燥无味重复单调,需要大量廉价劳动力,CPU自己不屑于干、做不来的活)并处理GPU在各种订单间的上下文切换;还负责获取来自内存等待加工的原材料(顶点数据、纹理数据、各种buffer等),将其存放到仓库(显存)中。
  • Input Assembler :负责将甲方给的顶点数据进行简单组装(根据顶点索引与图元类型装配),并搭配上属于它们的顶点属性,才能传给Vetex Work Distribution。
  • Vertex、Pixel、Compute Work Distribution :三个小包工头,负责将自己领域更加具体的工作分发给底下一大堆流水线工人们去做(从名字就可以看出,他们分别分发顶点、片元和计算着色器的任务)。
  • TPC(Texture Processing Clusters) :这个名字比较令人困惑,里面有 一个纹理单元和两个负责计算的SM(Streaming Multiprocessor) 。都是干活的生力军,上面三个小包工头的活全都是它们完成的,从这里就可以看出所谓的统一的硬件结构是指什么了。这个结构下一章会具体展开,先让我们记住这个啥都能做的「全栈工程师」。
  • Viewport/clip/setup/raster/zcull block :顶点着色器处理完,只是输出一堆裁剪坐标(还未透视除法)和一堆与其一起等待光栅化插值的属性,这个模块就是负责这些,流水线中到目前为止都未开放编程的固定功能部分。
  • ROP(Raster Operations Processor) :除了格子间里流水线上的工人,身为码头工人的ROP也是任劳任怨的好员工。他们负责对片元着色器处理后的像素进行测试和装箱:同一个像素位置的 深度/模板测试和写入、颜色混合、抗锯齿 都由它完成。因为片元着色器处理一个位置的片元时,并不知道该位置其他片元的信息,所以需要有这么一位码头工人在最终将产品(像素颜色)发往仓库前,做最后的统筹合并修缮工作。
  • L2 Cache、Memory Controller和DRAM :从图上可以看到,每个仓库(DRAM)搭配一个码头(图中未标的Memory Controller)、码头临时库存(L2 Cache)和一个码头工人(ROP),共有6组这样的搭配,每个搭配对应着显存六分之一的物理地址。格子间TPC里并行工作着的SM们发来了一条又一条的数据吞吐请求,会在码头集中处理,这些请求可能会被合并,并根据优先级从仓库获取数据 以实现数据传输效率的最大化 ;被码头工人最终装箱完(颜色混合、硬件抗锯齿)的像素数据也会被码头发往仓库中的帧缓冲。
  • 从外包公司的角度去理解GPU,整个流程就逐渐明晰了起来。而TPC里密密麻麻的格子间中,到底有着什么不为人知的秘密?各类着色器纷繁复杂的指令,是如何在其间高效且有序完成的,请看下一章,Tesla架构(二)之血汗工厂篇。

    如果您觉得本篇文章对你有点帮助的话,可以点个赞再走哦~别只是放到收藏夹里吃灰呀~

    参考

    1. Geforce 256
    2. GeForce FX
    3. Tesla架构白皮书