當前位置:
首頁 > 知識 > 如何理解 NVIDIA新GPU 架構 Turing的Tensor Core?

如何理解 NVIDIA新GPU 架構 Turing的Tensor Core?

這裡是 AI 研習社,我們的問答版塊已經正式推出了!歡迎大家來多多交流~

https://club.leiphone.com/page/question


社長為你推薦來自 AI 研習社問答社區的精華問答。如有你也有問題,歡迎進社區提問。

話不多說,直接上題

問:如何理解 NVIDIA 新 GPU 架構 Turing 的 Tensor Core?

不久前,NVIDIA在SIGGRAPH 2018上正式發布了新一代GPU架構——Turing(圖靈),黃仁勛稱Turing架構是自2006年CUDA GPU發明以來最大的飛躍。Turing架構的兩大重要特性便是集成了用於光線追蹤的RT Core以及用於AI計算的Tensor Core,使其成為了全球首款支持實時光線追蹤的GPU。

來自社友的回答

@約翰尼德普

在關於Volta混合精度Tensor Core的幾個謎團中,一個比較煩人的問題是4×4矩陣乘法的能力。Tensor Core是一種新型處理核心,它執行一種專門的矩陣數學運算,適用於深度學習和某些類型的HPC。Tensor Core執行融合乘法加法,其中兩個4*4 FP16矩陣相乘,然後將結果添加到4*4 FP16或FP32矩陣中,最終輸出新的4*4 FP16或FP32矩陣。

NVIDIA將Tensor Core進行的這種運算稱為混合精度數學,因為輸入矩陣的精度為半精度,但乘積可以達到完全精度。碰巧的是,Tensor Core所做的這種運算在深度學習訓練和推理中很常見。

Tensor Core雖然在GPU里是全新的運算單元,但其實它與標準的ALU流水線並沒有太大差別,只不過Tensor Core處理的是大型矩陣運算,而不是簡單地單指令流多數據流標量運算。Tensor Core是靈活性和吞吐量權衡的選擇,它在執行標量運算時的表現很糟糕,但它可以將更多的操作打包到同一個晶元區域。

Tensor Core雖然有一定的可編程性,但仍然停留在4*4矩陣乘法累加層面上,並且不清楚累積步驟是如何以及何時發生的。儘管被描述為進行4*4矩陣數學運算,但實際上Tensor Core運算似乎總是使用16*16矩陣,並且操作一次跨兩個Tensor Core進行處理。這似乎與Volta架構中的其他變化有關,更具體地說,與這些Tensor Core是如何集成進SM中有關。

對於Volta架構,SM被劃分為四個處理塊或子核。對於每個子核,調度器每個時鐘向本地分支單元(BRU)、Tensor Core陣列、數學分派單元或共享MIO單元發出一個warp指令,這就首先阻止了Tensor運算和其他數學運算同時進行。在利用兩個Tensor Core時,warp調度器直接發出矩陣乘法運算,並且在從寄存器接收輸入矩陣之後,執行4*4*4矩陣乘法。待完成矩陣乘法後,Tensor Core再將得到的矩陣寫回寄存器。

在Tensor Core執行實際指令時,即使在使用NVVM IR(LLVM)的編譯器級別上,也僅存在用於warp級矩陣操作的本徵,對於CUDA++和PTX ISA,warp級別仍然是唯一級別。載入輸入矩陣的形式是每個扭曲線程持有一個片段,其分布和身份均未指定。從廣義上講,它遵循標準CUDA核心的基於線程級別拼接的GEMM計算的相同模式。

一般而言,給定A*B+C Tensor Core操作,片段由A的8個FP16*2元素(即16個FP16元素)和B的另外8個FP16*2元素,以及FP16累加器的4個FP16*2元素或 FP32累加器的8個FP32元素組成。

在矩陣乘法累加運算之後,計算結果會分散在每個線程的目標寄存器片段中,需要在整個範圍內統一,如果其中一個warp線程退出,這些低級操作基本上就會失敗。

Citadel LLC團隊的低級微基準測試揭示了許多Volta微體系結構細節,包括Tensor Core操作和相關的片段,與輸入矩陣相比,它們都位於寄存器和標識中。他們觀察到,子核核心以特定的拼接模式計算矩陣乘法,其中所有32個warp線程都在運行。

從概念上講,Tensor Core在4*4子矩陣上運行,以計算更大的16*16矩陣。warp線程被分成8組,每組4個線程,每個線程組連續計算一個8*4塊,總共要經過4組的過程,每一個線程組都處理了目標矩陣的1/8。

在一個集合中,可以並行完成四個HMMA步驟,每個步驟適用於4*2子塊。這四個線程直接鏈接到寄存器中的那些矩陣值,因此線程組可以處理單個Step 0 HMMA指令,從而一次性計運算元塊。

由於矩陣乘法在數學上需要對某些行列進行復用,以允許跨所有8*4塊並行執行,每個4*4矩陣被映射到兩個線程的寄存器。在計算16*16父矩陣的4*4次子矩陣運算中,這將包括將連續計算的集合相加,形成16*16矩陣中4*8個元素的相應塊。儘管Citadel沒有對FP16進行測試,但它們發現FP16 HMMA指令只產生2個步驟,而不是4個步驟,這或許與FP16隻佔用的較小的寄存器空間有關。

通過獨立的線程調度和執行,以及warp同步和warp-wide結果分配,基本的4*4*4 Tensor Core操作轉換為半可編程16*16*16混合精度矩陣乘法累加。雖然CUDA 9.1支持32*8*16 and 8*32*16矩陣,但相乘的矩陣都需要相應的列和行為16,最終矩陣為32*8或8*32。

Tensor Core的運行方式似乎是NVIDIA GEMM計算層次結構的一個硬體實現的步驟,如CUTLASS(用於GEMM操作的CUDA C ++模板庫)中所示。對於傳統的CUDA核心,最後一步需要將warp tile結構分解為由各個線程擁有的標量和向量元素。使用WMMA API(現在表示張量核),所有這些都被抽象掉了,只剩下了需要處理的合作矩陣片段載入/存儲和多重積累。積累發生在一個FMA類型的操作中。

NVIDIA深度學習Tensor Core全面解析(上篇)在寄存器級別上,NVIDIA在他們的Hot Chips 2017論文中提到「使用三個相對較小的乘法和累加器數據的4*4矩陣,可以執行64次乘加運算。」而增強的Volta SIMT模型的每線程程序計數器(能夠支持張量核)通常需要每個線程2個寄存器槽。HMMA指令本身會儘可能多復用寄存器,所以我無法想像寄存器在大多數情況下不會出現瓶頸。

對於獨立的4*4矩陣乘法累加,Tensor Core陣列在寄存器、數據路徑和調度方面很有核能並沒有物理設計,它只能用於特定的子矩陣乘法。

無論如何,從NVIDIA的角度來看,Volta不是一顆深度學習的專用ASIC,它仍然覆蓋GPGPU的領域,因此保持CUDA可編程Tensor Core適用於GEMM / cuBLAS和HPC是合乎邏輯的。對於CUDA c++的CUTLASS來說,情況更是如此,因為它的WMMA API支持旨在為廣泛的應用程序啟用Tensor CoreGEMM操作。從根本上說,NVIDIA深度學習硬體加速的發展與cuDNN(以及cuBLAS)的發展有很大關係。

詳細信息請參考:

https://www.leiphone.com/news/201808/RsZr7QRlQMfhMwOU.html


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 AI研習社 的精彩文章:

針對 3D 計算機視覺的簡介
35本AI 入門、大數據、機器學習免費教程

TAG:AI研習社 |