創作內容

7 GP

小閒聊?關於GPU那些事情(後續會修改大概?)

作者:垂暮龍-青月(動物朋友│2019-04-03 21:32:39│巴幣:110│人氣:230
隨著最近閱讀越來越多,也發現越來越多事情。

首先GPU架構並不如同CPU那樣,設計繁瑣的控制單元儲存大量的表,不過還是依然有其部份。

這些控制單元的繁瑣設計來自於修改指令的順序甚至其衍生的各種關聯上下文之改變。

從單純的提取到解碼甚至整個過程本身就會互相傳遞控制流,而控制流本身在被視同一個單一的核心內,總是只有一個的。

如果擁有不同控制流甚至發生切換,那就會存在分支。

那麼分支的本質是什麼?即是切換序列,從局部的位置遠離到更遠的位置。

在計算機的原始的樣貌上,不過是將外在的資料轉換為數位的,可以正交分解改換順序而不會影響其詮釋能力。

固定的值或應該稱作『空間』的概念上,是一致的。

某種數值對映著某種顏色,就是一種函數,一種空間上的變換。

而數學這門語言記載了許多研究空間甚至各種性質的,才能得以應用在計算機上,從而實現各種可重複重現的功能。

計算的過程就是根據有限的訊息,甚至於小部分的訊息,將確定所得到的訊息轉換成另一種訊息並持續運作,最終轉換到相應的位置傳遞出來成我們可以感受到的訊號。

計算、存取、控制足以解釋計算機的架構,無論無比高深都能夠用此解釋。

那麼...就理想上的吞吐率,也就是我們試作為產出量的數值,如果能削減掉不必要的,是不是就能越高呢?

理論上是這樣沒錯,但是吞吐率越高並不代表最終成果就越好,因為最終成果的道路上,吞吐率越高只是達成的條件之一。

如果每個單位的吞吐能力產生的位元流,每個位元詮釋的不一樣,根本就沒有比較性可言。

對於數位系統的設計,抽象了具體的電路後,僅僅看到的是各種『穩定存在』的位元。

位元的數量、位元的翻轉,組織其規則的布林運算和邏輯閘門,在不出意外的情況下,主宰了所有變化,對於計算機的架構解析到了這一層抽象而無須往下,就可以解釋所有了。

在真正計算電路的功耗上,用位元的翻轉數量和其統計整體,可以準確有效的得出功耗,可以透過模擬的方式得出逼近的結果。

.......大致上到這裡

在多方面上,位元的處理量代表了吞吐這項數值。

很有力的,是足以解釋各方面的為什麼。

可是跟外界的交換變化,會改變每個位元相應的能力,所以儲存位元的數量並不保證其演變的精確性,建立其上模擬外界變化的邏輯,也就是一套演算法相應而生。

演算法在當教科書教授很深厚時,能意識到可以拆分出種種重複使用的構造,它們就是資料結構,於是資料結構這門科目被獨立出來了。

一套算術所寫出的步驟,即演算法和資料結構相結合後,就是一個完整的程式。

不過也並不是每個都必須要這樣視作的,對於普通寫程式的來講,不過就是弄了架構框架之類,寫了各式邏輯,然後相接合在一起可以運作就好了,不會過於探究為什麼要精確解釋。

算術所用到的語言指令,真要拆分本質上也只是並行傳遞了控制指令到各方面,逐一驅動ALU罷了。

而在這過程中,得到了大量資料流,要讓資料流到相應位置卻是現代架構種種的瓶頸之處。

假設說我們用光纖連結遙遠如上百公里的主記憶體,然後這裡放了一顆整合完整的CPU,獨缺了快取,但保有了暫存器(連暫存器都沒有也太慘忍了)。

在這裡解釋一下為什麼要有暫存器好了,如果沒有暫存器的話,一但匯流排也就是bus傳輸就必須強迫來源過來的過程中不得切換,因為在單位的時間內肯定只是某個位元組能夠通訊而已,不能通訊其他,等於其他單位都不要用了。

來源(記憶體)->->->->->[計算1,計算2,計算3]

沒有暫存器的時候,只能傳計算1的資料在某個單位時間內,計算2跟計算3整個被廢掉了。

然後你好不容易CPU算完了,你必須得傳回遙遠上百公里的主記憶體,此時的你算一算理論的速度,整個過程都被傳輸給卡死了,而且上百公里遠的傳輸耗能可是不少的,相比CPU的一次計算來說。

那麼你把這問題規模縮小許多後,你終於意識到了問題本質在哪裡了,從儲存位置的來源來說....

實在太遠了!

遠到來回交互都是痛苦的過程,等效的頻寬無比低落,能夠處理的量非常低。

那你可能會說,把記憶體放近一點就好了....但無濟於事。

因為這個問題可以視作於某個儲存位置到某個計算單元。

如果今天儲存位置有近乎無限個,每個都存在體積,那還能都接近於計算單元嗎?那肯定不可能。

所以才會需要有多個儲存階層。

但是儲存階層總是有限的,最終還是得切換出去,畢竟相對於無數的儲存位置,能夠鄰近計算單元的存在總是有限的。

而這些方式為了有實用性,肯定要透過一套方法計算並控制改善交換過程。

所設計出來的方法被實作成控制單元固化了,相比於基礎的控制模組來說,無疑地複雜的非常多,被視為是高階的CU。

而這些設計出來的行為就是最佳化通訊距離,因為問題是計算的功能單元和儲存位置之間。

為了研究種種,得出了良好的運作與詮釋性源於程式碼的局部性,良好的程式碼或著邏輯必然帶來所謂的局部性。

或許可以區分種種,但不過通常只需要解釋兩個。

空間局部性:上一個儲存位置到下一個儲存位置總是鄰近,理想是無縫的。

時間局部性:總是會重用一組儲存位置。

空間局部性代表了計算的量也就是吞吐率、產出量越高在單位成本下。

而時間局部性則代表了模式性或其反覆運算的特性,重用某個位置就不用到其他位置去,可以說更短了,甚至能從中分析出其他訊息。

如何提高兩者呢?很明顯得在資料結構上一直都有在教導的一件事情。

『排序』

一個良好順序的集合,前後左右鄰近,並且擁有良好預測的特性,如果某個點與某個點發生結合的運算,產生出來的也會是閉集。

(##可數和閉集問題有點困難,可以不用在意)

調換順序甚至修改迴圈等行為,從程式碼如高階的C你可能都不太能直接透過肉眼看到什麼改變,你只覺得好像沒變什麼多少為什麼要這麼做呢?

透過改變順序的方式,縮減了距離在小的迴圈內跑,改善了局部性,甚至於把分支都幹掉了不少。

分支的減少也提高了不少性能,不過通常很難感受到,因為現代硬體從多方面的改進花費了太多硬體成本,即使不好也很難感受到,很充裕的資源的因素。

分支的存在是控制來改進改善存取如記憶體這樣順序表的因素。

分支有如無條件或有條件分支等,透過指令集可以直接看到提供。

有寫分支指令會存在分支,這很容易想的到。

但是沒有看到分支就代表沒有分支嗎?沒有看到什麼控制的語句,就覺得分支不存在嗎?

並不是的.....只要你一但程式碼要執行的位置跑遠了,跳躍了一段距離,就會存在分支。

而現代的程式中,最基礎於圖論的『樹』,樹的結構用到了分支。

所以要消滅分支來提升性能是非常困難的事情,它是必然的存在。

分支的存在使得硬體成本上升,但也多了一個優點,你不必撰寫根本不可能做得出來的算術邏輯來改變儲存位置提高效率。

如果你為了要處理某組資料到某個資料,這些資料的組成可能很沒有順序的存在。

為了可以有效率處理一組一群的資料,你必須寫出組合出很繁瑣的計算過程來改進,但很可能輸出入的時候資料本身存在的位置組合根本沒有。

那麼透過分支來說,就能寫出簡單有效的程式,而不必強迫跑一長串不必要的位置逐一載入儲存。

你直接透過分支本身跳躍到特定位置,直接完成該筆資料的運算即可,然後每一筆處理完就完成了。

可以說你的程式碼可以不用寄託於玄學來改善效率。

你只需要寫出符合的語法,生出種種分支和判斷處理,這樣電腦就穩定了產出來了還保有高效。

而分支的存在會耗損更多資源外,更多的是難以消除它所導致的問題--降低效率。

分支的存在是從不同的點進去一長組連續位置而已,一套設計儲存媒介的方法罷了,如快取記憶體這樣,又或著是暫存器堆,彼此不同階層映射一小部分複製來同步交換。

如果只是這樣,設計只是龐大而已和耗能。

但是不可免的,有些結構碰到分支就很難受了,比如管線化。

管線化是一種廉價的同步平行方法,從而做到許多指令並行處理。

對它來說,根本沒有很多前後級可以選擇進入,一但發生分支了為避免邏輯錯誤只能清除重來嚕。

在這之後才衍生了OoO(亂序執行),從理論基礎上可以多埠選擇暫存器然後基於一些推斷構造出更複雜的方法,最終完成亂序。

說了這麼多,其實就是在講通用運算本身。

那麼來到GPU本身呢?首先GPU處理的資料擁有很良好的空間局部性,所以吞吐率很高。

但是並不是所有用於GPU的算法都有良好的順序空間特性。

這會導致一個問題,利用率低下。

尤其GPU的本業,也就是即時的彩現(一般習慣稱渲染),應用了許多紋理的高階操作,各式各樣配裝組成的繁瑣算術。

這些貼圖(Map)甚至一些算術,都需要不是基礎資料結構,需要樹甚至更高的資料結構才能完成存取,必然存在分支。

更別說不同物體間需要相互採樣了,等於局部性本身被打破了一角。

跟理想上所謂的GPU能任意擴張規模來平行化根本不一樣也不可能。

在這個過程內完成,你就得於要寫邏輯來同步上下文處理,用了更多儲存的單元,需要更高的更大的暫存器等。

這也就是為什麼GPU會設計的越來越複雜,從而電晶體數目等和單位處理的位元量,或著一般所看見的『浮點數』『像素或紋理吞吐率』在下降。

但是實際上性能並沒有下降,而是沒有意識到這些演算法並不適合在單純堆高理論值的架構上跑,最終成果不就是浪費面積而已,因為很可能根本內部頻寬不足以支撐到這麼高的ALU數目。

這些大抵上就是小談了,詳細需要解釋為什麼設計這樣需要探討如SM(CU)及warp的設計和使用上現代的論文,會更好剖析出瓶頸問題,架構的演變。

更複雜的GPU可以適應更強大的著色器,也開始涉足了GPGPU這些通用運算領域,只是相比於控制單元完整而強大(應該說更全面的)CPU,分支處理能力高低完全不能相比,甚至於類型支持不足,所以難以實現一個好的程式在上面跑。

##分支/跳躍通常用於實現隨機存取機平行之功能,如(平行隨機存取機),用以改變指令流,指令的存在是解釋或處理資料的關係。

單純解釋資料的間隔距離的處理是『隨機存取』,擁有模式可以改變順序或硬體掩蓋的話,則指令流不中斷而能繼續存取,而能提高效率。

部份口語可能難以閱讀,可以參考並提出改進。

###更新 (4/4)

若有空與能力許可將撰寫『GPU著色模型的組成 及 讀與寫的理論』

覆蓋如頂點開始到緩衝輸出結束,希望能撰寫程式碼範例與為何需要如此限制和編寫過程中所需要使用到的資料結構介紹,從SM3.0到SM5.0甚至6.0。(若能許可)

讀與寫的理論,希望能從讀寫的模型開始出發,是如何完成一致性通訊及為何需要強調設計的類型,它們之間差在哪裡呢?可以從微小的地發出發到了解規模擴展的問題。
引用網址:https://home.gamer.com.tw/TrackBack.php?sn=4347180
All rights reserved. 版權所有,保留一切權利

相關創作

留言共 0 篇留言

我要留言提醒:您尚未登入,請先登入再留言

7喜歡★digong94 可決定是否刪除您的留言,請勿發表違反站規文字。

前一篇:到今日指令集這些無聊區別... 後一篇:程式語言到底能不能比較效...

追蹤私訊切換新版閱覽

作品資料夾

leo25127更新至1235回
穿越奇幻日常系小說『公爵家的獨生子』更新囉,來看看我們無厘頭的ㄎ一ㄤ少爺怎麼在異世界作威作福吧!看更多我要大聲說昨天08:38


face基於日前微軟官方表示 Internet Explorer 不再支援新的網路標準,可能無法使用新的應用程式來呈現網站內容,在瀏覽器支援度及網站安全性的雙重考量下,為了讓巴友們有更好的使用體驗,巴哈姆特即將於 2019年9月2日 停止支援 Internet Explorer 瀏覽器的頁面呈現和功能。
屆時建議您使用下述瀏覽器來瀏覽巴哈姆特:
。Google Chrome(推薦)
。Mozilla Firefox
。Microsoft Edge(Windows10以上的作業系統版本才可使用)

face我們了解您不想看到廣告的心情⋯ 若您願意支持巴哈姆特永續經營,請將 gamer.com.tw 加入廣告阻擋工具的白名單中,謝謝 !【教學】