GPU軟體體系

2021-06-06 16:50:51 字數 2802 閱讀 8598

cuda的軟體體系

cuda的軟體堆疊由以下三層構成:cuda library、cuda runtime api、cuda driver api,如圖所示,cuda的核心是cuda c語言,它包含對c語言的最小擴充套件集和乙個執行時庫,使用這些擴充套件和執行時庫的原始檔必須通過nvcc編譯器進行編譯。

cuda c語言編譯得到的只是gpu端**,而要管理費用gpu資源,在gpu上分配視訊記憶體並啟動核心函式,就必須借助cuda執行時的api(runtime api)或者cuda驅動api(driver api)來實現。在乙個程式中只能使用cuda執行時api與cuda驅動api中的一種,不能混和使用。

一、cuda c語言

cuda c語言為程式提供了一種用c語言編寫裝置端**的程式設計方式,包括對c的一些必要擴充套件和乙個執行時庫。cuda對c的擴充套件主要包括以下幾個方面

1.引入了函式型別限符。用來規定函式是在host還是在device上執行,以及這個函式是從host呼叫還是從device呼叫。這些限定符有:__device__,__host__,__global__.

2.引入了變數型別限定符。用來規定變數被儲存在哪一類儲存器上。傳統的在cpu上執行的程式,編譯器能自動決定將變數儲存在cpu的暫存器還是記憶體中,在cuda程式設計模型中,一共抽象出來多棕8種不同的儲存器。為了區分各種儲存器,必須引入一些限定符,包括:__device__,__shared__和__constant__。注意,此處的__device__與上節中的__device__限定符的含義不同。

3.引入了內建變數型別。如char4,ushort3,double2,dim3等,它們是由基本的整型可浮點型構成的向量型別,通過x,y,z,w訪問每乙個分量,在裝置端**中各向量型別有不同的對齊要求。

4.引入了4個內建變數。blockidx和threadidx用於索引執行緒塊和執行緒,griddim和blockdim用於描述執行緒網格和執行緒塊的維度。warpzize用於查詢warp中的執行緒數量。

5.引入了<<< >>>運算子。用於指定執行緒網格和執行緒維度,傳遞執行引數。

6.引入了一些函靈敏:memory fence函式函式,同步函式,數學函式,紋理函式,測時函式,原子函式,warp vote函式。

以上擴充套件均有一些限制,如果違背了這些限制,nvcc將給出錯誤或警告資訊,但有時也不會報錯,程式無法執行。

二、nvcc編譯器

nvcc編譯器根據配置編譯cuda c**,可以生成三種不同的輸出:ptx,cuda二進位制序列和標準c。nvcc是一種編譯驅動。通過命令列選項,nvcc可以在編譯的不同階段啟動不同的工具完成編譯工作。

nvcc工作的基本流程是:首先通過cudafe分離原始檔中的主機端和裝置端**,然後再呼叫不同的編譯器分別編譯。裝置端**由nvcc編譯成ptx**或者二進位制**;主機端**則將以c檔案形式輸出,由其他主效能編譯器,舅icc,gcc或者其他合適的高效能編譯器等進行編譯。不過,也可以直接在編譯的最後階段,將主機端**交給其他編譯器生成.obj或者.o檔案。在編譯時,可以將裝置端**鏈結到所生成的主機端**,將其中的cubin物件作為全域性初始化資料陣列包含進來。此時,核心執行配置也要被轉換為cuda執行啟動**,以載入和啟動編譯後的核心函式。使用cuda驅動api時,可以單獨執行ptx**或者cubin物件,而忽略nvcc編譯得到的主機端**。

編譯器前端按照c++語法規則對cuda原始檔進行處理。cuda主機端**可以支援完整的c++語法,而裝置端**則不能完全支援。

核心函式可能通過ptx編寫,但通常還是通過cuda c一類的高階語言進行編寫。ptx或cuda c語言編寫的核心函式都必須通過nvcc編譯器編譯成二進位制**。一部分ptx指令只能在擁有較高計算能力的硬體上執行,比如對全域性儲存器的32bit原子操作指令就只有計算能力1.1以上的硬體才能支援,雙精度計算只有計算能力1.3以上的硬體才能支援。nvcc通過編譯選項來指定要輸出的ptx**的計算能力。因此,在需要雙精度計算時,就必須加上-arch sm_13(或者更高計算能力)編譯選項才能正常執行,否則雙精度計算將被編譯為間精度的計算。

三、執行時api與驅動api

cuda runtime api和cuda driver api提供了實現裝置管理(device management),上下文管理(context management),儲存器管理費用(memory control),**塊管理 (code module management),執行控制(excution control),紋理索引管理(texture reference management)與opengl和direct3d的互操作性(interoperity with opengl and direct3d)的應用程式介面。

cuda runtime api在cuda driver api 的基礎上進行了封裝,隱藏了一些實現細節,程式設計更加方便,**更加簡潔。cuda runtime api被打包放在cudaart包裡,其中的函式都有cuda 字首。cuda執行時沒有專門的初始化函式,它將在第一次呼叫函式時自動完成初始化。對使用執行時函式的cuda程式測試時要避免將這段初始化的時間計入。cuda runtime api的程式設計較為簡潔,通常都會用這種api進行開發。

cuda driver api是一種基於控制代碼的底層介面(式多物件通過控制代碼被引用),可以載入二進位制或彙編形式的核心函式模組,指定引數,並啟動計算。cuda driver api的程式設計複雜,但有時能通過直接操作硬體的執行實行一些更加複雜的功能鍵,或者獲得更高的效能。由於它使用的裝置端**是二進位制或者彙編**,因此可以在各種語言中呼叫。cuda driver api被放在nvcuda包裡,所有函式字首為cu。

四、cuda函式庫

五、cuda儲存器模型

cuda 提供了8種儲存器模型。其它略。

GPU體系結構

gpu的硬體結構,也不是具體的硬體結構,就是與cuda相關的幾個概念 thread,block,grid,warp,sp,sm。sp 最基本的處理單元,streaming processor 最後具體的指令和任務都是在sp上處理的。gpu進行平行計算,也就是很多個sp同時做處理 sm 多個sp加上其...

現代GPU的體系結構

大規模並行處理器程式設計實戰 第2版 全面更新了並行程式設計方法和技術的內容。本書旨在綜述並行程式設計,展示了專業人士和學生都可以使用的一種程式設計思維,以此來指導並行程式設計和優化應用程式,從而使效能得到顯著提公升。本節為大家介紹現代gpu的體系結構。ad 1.2 現代gpu的體系結構 採用cud...

軟體體系架構

架構在軟體發明的很多年前就已經存在了,但是架構的定義一直不是很明確。由於產生分工把所有事情劃分為由不同角色的人來完成然後再進行交易,這實際上就形成了社會的架構。對於不同的行業,都可以有同樣的思考,根據自己對世界的認識,為解決某個問題,主動地 有目的地去識別問題,並進行分解 合併,解決這個問題的實踐活...