天天看點

《CUDA C程式設計權威指南》——1.4 使用CUDA C程式設計難嗎

本節書摘來自華章計算機《cuda c程式設計權威指南》一書中的第1章,第1.4節,作者 [美] 馬克斯·格羅斯曼(max grossman),譯 顔成鋼 殷建 李亮,更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。

cpu程式設計和gpu程式設計的主要差別是程式員對gpu架構的熟悉程度。用并行思維進行思考并對gpu架構有了基本的了解,會使你編寫規模達到成百上千個核的并行程式,如同寫串行程式一樣簡單。

如果你想編寫一個像并行程式一樣高效的代碼,那麼你需要對cpu架構有基本的了解。例如,資料局部性在并行程式設計中是一個非常重要的概念。資料局部性指的是資料重用,以降低記憶體通路的延遲。資料局部性有兩種基本類型。時間局部性是指在相對較短的時間段内資料和/或資源的重用。空間局部性是指在相對較接近的存儲空間内資料元素的重用。現代的cpu架構使用大容量緩存來優化具有良好空間局部性和時間局部性的應用程式。設計高效利用cpu緩存的算法是程式員的工作。程式員必須處理低層的緩存優化,但由于線程在底層架構中的安排是透明的,是以這一點程式員是沒有辦法優化的。

cuda中有記憶體層次和線程層次的概念,使用如下結構,有助于你對線程執行進行更高層次的控制和排程:

記憶體層次結構

線程層次結構

例如,在cuda程式設計模型中使用的共享記憶體(一個特殊的記憶體)。共享記憶體可以視為一個被軟體管理的高速緩存,通過為主記憶體節省帶寬來大幅度提高運作速度。有了共享記憶體,你可以直接控制代碼的資料局部性。

當用ansi c語言編寫一個并行程式時,你需要使用pthreads或者openmp來顯式地組織線程,這兩項技術使得在大多數處理器架構以及作業系統中支援并行程式設計。當用cuda c編寫程式時,實際上你隻編寫了被單個線程調用的一小段串行代碼。gpu處理這個核心函數,然後通過啟動成千上萬個線程來實作并行化,所有的線程都執行相同的計算。cuda程式設計模型提供了一個階層化地組織線程的方法,它直接影響到線程在gpu上的執行順序。因為cuda c是c語言的擴充,通常可以直接将c程式移植到cuda c程式中。概念上,剝離代碼中的循環後産生cuda c實作的核心代碼。

cuda抽象了硬體細節,且不需要将應用程式映射到傳統圖形api上。cuda核中有3個關鍵抽象:線程組的層次結構,記憶體的層次結構以及障礙同步。這3個抽象是最小的一組語言擴充。随着cuda版本的更新,nvidia正在對并行程式設計進行不斷簡化。盡管一些人仍然認為cuda的概念比較低級,但如果稍稍提高抽象級,對你控制應用程式和平台之間的互動關系來說會增加很大難度。如果那樣的話,不管你掌握了多少底層架構的知識,你的應用程式的性能都将超出控制。

是以,你的目标應是學習gpu架構的基礎及掌握cuda開發工具和環境。

《CUDA C程式設計權威指南》——1.4 使用CUDA C程式設計難嗎

繼續閱讀