當前位置: 華文星空 > 汽車

【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架構白皮書