剖析NVIDIA Volta架構之指令篇

2021-08-19 18:39:08 字數 2611 閱讀 8060

由於實驗結果不太好,現在已經開始往最底層的sass修改上努力了,鑑於nvidia官方出於大概是商業目的,關於sass的內容少之又少,因此只能零星地從各種*****或者之類的東西裡尋找。前兩天發現了乙個文件,是關於volta架構的,裡面講了一些關於sass的內容,大致和 maxas 的介紹差不多但是更好懂,特此翻譯了相關部分,也就是第二章的內容。

volta使用的指令編碼方式與pascal和maxwell架構不同。

與以前架構最為不同的地方就是,volta使用128位來編碼每個指令和指令對應的控制資訊。以前的架構都是使用64位編碼每個指令,然後再分出額外的64位來表示控制資訊,而一條控制資訊可能是和多條指令相關聯的。下面是個相關的例子:

以上**是使用nvdisasm反彙編出來的,其分成兩個64位用於方便顯示,第一行只是編碼後的指令資訊,第二行包含指令資訊和控制資訊。

據我們從徹底的彙編指令中得到的知識,這128位是按照如下規則劃分的:

kepler架構將控制資訊引入了編譯器對於指令的編碼排程過程。控制資訊能夠防止資料衝突並且允許簡單的片上邏輯,這使gpu獲得更高的計算密度和更低能耗

在volta上,128位包括指令和指令相關的控制資訊

volta之前的架構都是一條控制資訊和多條指令相連(在pascal和maxwell裡是3條,kepler裡是7條)。每一條控制資訊表示了與它相關的這幾條指令的排程方式。下面的**就是pascal架構下的示例,一共包括4個64位字,第乙個64字只有十六進製制的表示而沒有對應的指令,就是控制字段;而餘下的三個就是指令。

/* 0x000f8800fe2007f1 */

/*0288*/

@p5 ldg.e.ci r66, [r86+0x100]; /* 0xeed4a00010055642 */

/*0290*/

@!p5 mov r66, rz; /* 0x5c9807800ffd0042 */

/*0298*/

@p6 ldg.e.ci r67, [r86+0x180]; /* 0xeed4a00018065643 */

控制資訊在不同的架構上編碼方式不同,具體如下:

volta,pascal和maxwell架構中的控制資訊的組織方式都是一致的,每個部分包括6個編碼域,如下所示:

其各自的意義如下:

重用標誌

volta,pascal和maxwell有4個暫存器重用cache和4個源運算元槽(slot)。這四位每一位都和乙個8bytes的槽相連。當設定了重用標誌之後,與之相連的暫存器值就會被存入暫存器重用cache中,給可能再次使用這個暫存器的指令使用。重用還能減少暫存器的儲存體衝突(bank conflict)。最低有效位代表第乙個源運算元槽,最高有效位代表第四個源運算元槽

等待柵(barrier)掩碼;讀寫柵標記

雖然大多數指令執行的時間是固定的並且能夠被彙編器靜態排程,但是那些包含訪存和共用計算資源的指令的執行時間則是變化的。volta,pascal和maxwell使用「依賴柵」來測定這些可變時延的指令的完成時間並解決資料衝突。通過設定」write barrier number」,當乙個可變時延的指令寫入乙個暫存器時,彙編器將其和乙個柵相連。當這個指令之後的某個指令想要訪問這個寫入的暫存器時,通過設定」wait barrier mask」中與對應柵相關的位,彙編器就將這個指令設定為等待當前柵完成。硬體就會讓這個指令被阻塞直到它需要的內容準備好。乙個指令可能需要等待多個柵的完成,這就是為什麼等待柵不是簡單的標記而是掩碼的原因。

讀依賴柵

讀依賴柵是用來解決讀後寫的問題。沒有緩衝區的指令在從暫存器讀取數寫入記憶體的時候,需要暫存器的數值不變。為了保證這個,彙編器通過設定」read barrier number」將其和乙個柵繫結。之後想要寫入這個暫存器的指令要等待這個柵的完成。

阻塞延遲

這個四位的域表示排程器在執行下乙個命令前需要等待的時間,範圍是0-15.在pascal和maxwell架構中,如果這個域和「yeild flag」的組合表示包含特定額位,就會使得乙個運算塊中的兩個分發器同時發出乙個兩個連續的指令,被稱為」dual issue「。在volta架構中只有乙個分發器,所以並沒有發現這種雙重發出的情況。

域標記volta使用域標記來平衡分配給處理塊的任務量。當這個標記位被設定,排程器就更傾向於發出當前warp的指令,如果沒有被設定,排程器就傾向於替換成別的warp,並使得所有的暫存器重用標誌都失效。如果切換成別的warp,會消耗額外的乙個時鐘週期。

volta的sm被分成了四個處理塊。相同warp上的指令會被分配給乙個特定的塊,並且只能使用這乙個塊內的計算資源。warp和(處理塊中)排程器的對映關係就是 scheduler_id = warp_id%4,為了證明它,我們進行了實驗(實驗略)

相比於以前的架構,volta使用更多的位編碼指令。

和以前那些將操作指令放在最高有效位的架構(pascal,maxwell和kepler)不同的是,volta將操作指令放在第乙個64位字的最低有效位。我們在附錄中展示了pascal和volta的編碼。

volta的操作碼的長度是10-13位。

Spark架構剖析

spark deploymet 部署 軟體中有哪些實體,實體間如何協調工作。cluster manager負責管理和分配集群資源 driver program相當於專案經理 executor 相當於軟體工程師 resource core memeory io 磁碟io 網路io coarse gra...

dfuse for EOSIO 架構剖析 架構總覽

dfuse for eosio 架構剖析 架構總覽 內容轉譯 在這第一集中,我先列出每乙個元件,之後位我們會一集一集地講解各個元件。所以這集只是乙個基本概述。那我們就先開始吧。這裡的第乙個元素,我跟你把它組合著說吧,搜尋系統是由四個部分組成的 search live 實時搜尋 search fork...

深入剖析MongoDB架構

近日,軟體工程師ricky ho的在 他的部落格 裡發表了一篇關於mongodb架構 mongodb architecture 的博文,雖然這是乙個聽起來感覺很寬泛的話題,但是作者在文章中確實對mongodb由內至外的架構進行了剖析。本文擷取了其文章中的幾張重點架構示意圖進行簡要描述。1 mongo...