向量體系結構(2)----SIMD指令集擴展和GPU


進行SIMD多媒體擴展的設計,源於一個很容易觀察到的事實:

許多多媒體應用程序操作的數據類型比對32位處理器進行針對性優化的數據類型更窄一些。

圖像三基色,都是8位。音頻采樣也都是8位和16位來表示。

SIMD的多媒體擴展指令與標准的SIMD指令相比,它指定的操作數更少,因此使用的寄存器堆更小。

 

SIMD擴展主要對一下三項進行了簡化:

1)多媒體SIMD擴展固定了操作代碼中數據操作數的數目,從而在x86的體系結構的MMX,SSE,AVX中添加了數百條指令。

2)多媒體SIMD沒有提供向量體系結構的更復雜的尋址模式,也就是步幅訪問和集中---分散訪問。

3)多媒體SIMD不像向量體系結構那樣,為了支持元素的條件執行而提供遮罩寄存器。

做這些擴展指令的目的也是加快那些精心編制的庫函數的運行速度,而不是由編譯器來生成的這些庫。

 

SIMD的優點:

1)芯片設計相對向量體系結構來說,較簡單,且不需要那么大的存儲器帶寬。

2)可以比較輕松的引入一些符合新媒體標准的指令。

 

GPU的祖先是圖形加速器,極強的圖形處理能力是GPU得以存在的原因。當前GPU的研究熱點是一種簡化的GPU編程的編程語言。

GPU幾乎擁有所有可以由編程環境捕獲的並行類型:多線程,MIMD,SIMD,指令級並行

NVIDA開發的是一種類似於C的語言和編程環境,通過克服多種並行的挑戰來提高GPU程序員的生產效率。這一系統稱為CUDA。

                 將所有的這些並行形式統一為CUDA線程,以這種最低級的並行作為編程原型。

                 編譯器和硬件可以將數以千計的CUDA線程聚合在一起。CUDA編程模型被定義為"單指令多線程(SIMT)"

                 執行時,以32個線程為一組,稱為線程塊,將執行整個線程塊的硬件稱為多線程SIMD處理器。

行執行和線程管理由GPU硬件負責,而不是由應用程序或操作系統完成,不同的線程塊之間可以使用全局存儲的原子操作來進行協調,

                 但是它們之間不能直接通信。

和很多並行系統一樣,CUDA在生產效率和性能之間進行了一點折中,提供了一些本身固有的功能,讓程序員能夠顯示控制硬件。

                 了解編程語言可以平衡生產效率和性能之間的關系。

AMD推出的與供應商無關的語言,OpenCL。

 

以NVIDIA系統為例,GPU可以很好的解決數據級並行的問題,也擁有着集中---分散數據傳送和遮罩寄存器,但是GPU的寄存器要比

                 向量處理器更多。有一些功能,GPU通過硬件來實現,在向量體系結構中通過軟件來實現。

網格是在GPU上運行,由一組線程塊構成的代碼。例如我們希望兩個向量乘在一起,每個向量長度為8192個元素。執行所有8192個

                 元素乘法的GPU代碼稱為網格(向量化循環)

為了便於管理,網格可以由線程塊(向量化循環體)組成。每個線程塊最多512個元素。一條SIMD指令一次執行32個元素。所以該例子

                 中,共有16個線程塊

網格和線程塊是GPU硬件中實現的編程抽象,可以幫助程序員組織自己的CUDA代碼。

                 

線程塊調度程序是將線程塊指定給執行該代碼的處理器,我們將這種處理器稱為多線程SIMD處理器。

線程塊調度程序與向量體系結構中的控制處理器類似。決定了該循環所需要的線程塊數,以及將他們分配給不同的多線程SIMD處理器。

 

SIMD多線程處理器與向量處理器類似。但是它的很多功能單元都是深度流水化的。

 

GPU是一個由多線程SIMD處理器組成的多處理器,加自己的線程塊調度程度。

 

GPU硬件中有兩級硬件調度程序:

1) 線程塊調度程序,將線程塊分配給多線程SIMD處理器

2) SIMD處理器內部的SIMD線程調度程序,調度何時運行SIMD指令線程

 

在多線程SIMD處理器中執行的指令,由並行功能單元來執行,稱為SIMD車道,每個SIMD處理器中的車道數在各代GPU中是不同的。

對於fermi,每個寬度為32的SIMD指令線程被映射到16個物理SIMD車道,所以每條SIMD指令需要兩個時鍾周期才能完成。

記分板,可以讓SIMD線程調度程序,了解哪個SIMD指令已經做好運行准備。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM