CUDA C 程式設計權威指南 學習筆記:第二章 CUDA程式設計模型
詳細細節參考書籍或者這個部落格《CUDA C程式設計權威指南》——第2章 CUDA程式設計模型 2.1 CUDA程式設計模型概述
2.1.1 CUDA程式設計結構
CUDA程式設計模型還利用GPU架構的計算能力提供了以下幾個特有功能。
1. 一種通過層次結構在GPU中組織執行緒的方法
2. 一種通過層次結構在GPU中訪問記憶體的方法
CUDA程式設計模型主要是非同步的,因此在GPU上進行的運算可以與主機-裝置通訊重疊。一個典型的CUDA程式包括由並行程式碼互補的序列程式碼。如圖2-2所示,序列程式碼(及任務並行程式碼)在主機CPU上執行,而並行程式碼在GPU上執行。主機程式碼按照ANSI C標準進行編寫,而裝置程式碼使用CUDA C進行編寫。一個典型的CUDA程式實現流程遵循以下模式。
- 把資料從CPU記憶體拷貝到GPU記憶體。
- 呼叫核函式對儲存在GPU記憶體中的資料進行操作。
- 將資料從GPU記憶體傳送回到CPU記憶體。
2.1.2 記憶體管理
udaMalloc與標準C語言中的malloc函式幾乎一樣,只是此函式在GPU的記憶體裡分配記憶體。通過充分保持與標準C語言執行庫中的介面一致性,可以實現CUDA應用程式的輕鬆接入。
cudaMemcpy函式負責主機和裝置之間的資料傳輸,這個函式以同步方式執行,因為在cudaMemcpy函式返回以及傳輸操作完成之前主機應用程式是阻塞的。
2.1.3 執行緒管理
CUDA明確了執行緒層次抽象的概念以便於你組織執行緒。這是一個兩層的執行緒層次結構,由執行緒塊和執行緒塊網格構成,如圖2-5所示。
- 同步
- 共享記憶體
不同塊內的執行緒不能協作。 執行緒依靠以下兩個座標變數來區分彼此。
- blockIdx(執行緒塊線上程格內的索引)
- threadIdx(塊內的執行緒索引)
網格和塊的維度由下列兩個內建變數指定。
- blockDim(執行緒塊的維度,用每個執行緒塊中的執行緒數來表示)
- gridDim(執行緒格的維度,用每個執行緒格中的執行緒數來表示)
2.1.4 啟動核函式
同一個塊中的執行緒之間可以相互協作,不同塊內的執行緒不能協作。核函式呼叫結束後,控制權立刻返回給主機端。你可以呼叫以下函式來強制主機端程式等待所有的核函式執行結束:cudaDeviceSynchronize(). 一些CUDA執行時API在主機和裝置之間是隱式同步的。當使用cudaMemcpy函式在主機和裝置之間拷貝資料時,主機端隱式同步,即主機端程式必須等待資料拷貝完成後才能繼續執行程式。
2.2 給核函式計時
2.2.1 使用CPU計時
由於GPU的執行是非同步的,所以使用CPU計時就必須要顯示做同步,cudaDeviceSynchronize()
2.2.2 使用nvprof計時
CUDA還提供了一個nvprof命令列分析工具
2.3 組織並行執行緒
從矩陣加法的例子中可以看出:
- 改變執行配置對核心效能有影響
- 傳統的核函式實現一般不能獲得最佳效能
- 對於一個給定的核函式,嘗試使用不同的網格和執行緒塊大小可以獲得更好的效能
相關文章
- CUDA學習筆記-1: CUDA程式設計概覽筆記程式設計
- cuda程式設計與gpu平行計算(四):cuda程式設計模型程式設計GPU模型
- CUDA程式設計模式程式設計設計模式
- CUDA程式設計模型【中科院課件】程式設計模型
- CUDA 學習筆記之程式棧筆記
- 《高質量C/C++程式設計指南》學習筆記C++程式設計筆記
- CUDA 8的混合精度程式設計程式設計
- NVIDIA CUDA 程式設計模型之Grid和Block程式設計模型BloC
- CUDA學習指南
- nginx學習筆記(6):程式模型的設計Nginx筆記模型
- Android程式設計權威指南(第二版)學習筆記(十五)—— 第15章 隱式 IntentAndroid程式設計筆記Intent
- Android程式設計權威指南(第二版)學習筆記(十六)—— 第16章 使用 intent 拍照Android程式設計筆記Intent
- 《通過遊戲程式設計實戰教新手學C++程式設計》學習筆記遊戲程式設計C++筆記
- 《WebGL程式設計指南》學習筆記——1.WebGL概述Web程式設計筆記
- C++/C高質量程式設計指南-筆記C++程式設計筆記
- GPU高效能程式設計CUDA實戰(二)GPU程式設計
- 第三篇:CUDA 標準程式設計模式程式設計設計模式
- CUDA程式設計(4.1)—— 宣告符(global、device、host等)程式設計dev
- 四. 文字程式設計--Windows程式設計課程學習筆記程式設計Windows筆記
- CUDA10.0官方文件的翻譯與學習之程式設計介面程式設計
- 網路程式設計學習筆記程式設計筆記
- 系統程式設計學習筆記程式設計筆記
- 《WebGL程式設計指南》學習筆記——2.使用< canvas >元素Web程式設計筆記Canvas
- 【CUDA學習】核心程式除錯除錯
- [心得] JavaScript權威指南學習筆記JavaScript筆記
- MongoDB權威指南學習筆記03MongoDB筆記
- 第二篇:CUDA 並行程式設計簡介並行行程程式設計
- Linux學習/TCP程式設計學習筆記LinuxTCP程式設計筆記
- cuda的c++程式C++
- CUDA 學習筆記之gpu結構筆記GPU
- CUDA 學習筆記之儲存器筆記
- CUDA學習筆記之柵欄同步筆記
- CUDA 學習筆記之向量宣告使用筆記
- 精通C#學習筆記---C#核心程式設計結構C#筆記程式設計
- Golang 學習筆記——tun/tap 程式設計Golang筆記程式設計
- 結構化程式設計--學習筆記程式設計筆記
- Javascript高階程式設計 學習筆記JavaScript程式設計筆記
- ROS串列埠程式設計學習筆記ROS串列埠程式設計筆記