《CUDA高性能并行计算》----2.2 需要知道的CUDA API和C语言拓展
本 節 書 摘 來 自 華 章 出 版 社 《CUDA高性能并行計算》 一 書 中 的 第2章,第2.2節, 作 者 CUDA for Engineers: An Introduction to High-Performance Parallel Computing[美] 杜安·斯托爾蒂(Duane Storti)梅特·尤爾托盧(Mete Yurtoglu) 著,蘇統華 項文成 李松澤 姚宇鵬 孫博文 譯 , 更 多 章 節 內 容 可 以 訪 問 云 棲 社 區 “華 章 計 算 機” 公 眾 號 查 看。
2.2 需要知道的CUDA API和C語言拓展
CUDA并行所需要的基本任務包含以下幾點:
使用特定的網格維度加載核函數(線程塊和線程的數目)。
明確哪些函數編譯后運行在設備(GPU)上、主機(CPU)上,或者兩者之上。
訪問和運用線程塊和線程的計算索引值。
分配內存和傳輸數據。
讓我們從介紹核函數的加載開始。正如上面討論的,核函數是一種特殊的函數,加載核函數與常規的函數調用看起來很像,詳細來說,加載核函數從一個函數名開始,比如aKernel,然后以一個包含了以逗號分開的參數列表的括號結尾。現在我們來看一下編程語言拓展:為了自然地表達并行并且聲明計算網格,在函數名和含有參數的括號中間加入了網格的維度和線程塊的維度(被放在三個尖括號中):
需要注意的是,Dg、網格中的線程塊數和Db、線程塊中的線程數目,一起組成了加載核函數中的執行配置和維度的聲明。
這構成了加載一個和函數的語法,但是如何聲明一個從主機端調用但是在設備端執行的函數仍有一些疑問。CUDA使用在函數前面添加下面的一個函數標識符來作為區分:
__global__是標志著和函數的標識符(可以在主機端調用并在設備端執行)。
__host__函數從主機端調用在主機端執行。(這是一個默認的限定符,通常被省略。)
__device__函數從設備端調用并在設備端執行。(從核函數中調用的函數需要有__device__限定符。)
在函數頭添加__host____device__函數會讓系統分別編譯這個函數的主機版本和設備版本。
核函數有幾個值得注意的權限和限制:
核函數不能帶有返回值,因此返回類型通常為void。并且核函數需如下聲明:
核函數提供了對于每一個線程塊和線程的維度數和索引變量。
維度數目變量:
gridDim聲明了網格中的線程塊數目。
blockDim聲明了每個線程塊中的線程數目。
索引變量:
blockIdx給出了這個線程塊在網格中的索引。
threadIdx給出了這個線程在線程塊中的索引。
在GPU上執行的核函數通常不能訪問主機端CPU可以訪問的內存中的數據。
CUDA運行時API提供了一些可以將輸入數據傳輸到設備端和將結果傳回到主機端的函數,如下所示:
cudaMalloc()函數可以分配設備端內存。
cudaMemcpy()將數據傳入或傳出設備。
cudaFree()釋放掉設備中不再使用的內存。
核函數并行進行多次運算,但是它們也放棄了對執行順序的控制。CUDA為需要同步和并發執行時提供了相應的函數:
__syncThreads()可以在一個線程塊中進行線程同步。
cudaDeviceSynchronize()函數可以有效地同步一個網格中的所有線程。
原子操作,例如atomicAdd(),可以防止多線程并發訪問一個變量時造成的沖突。
除了上文介紹的函數和標識符以外,CUDA同時提供了一些額外的有用的數據類型:
size_t:代表內存大小的專用變量類型。
cudaError_t:錯誤處理的專用變量。
向量類型:CUDA將標準C的向量數據類型拓展到了4個。獨立的組件通過后綴.x、.y、.z和.w進行訪問。
總結
以上是生活随笔為你收集整理的《CUDA高性能并行计算》----2.2 需要知道的CUDA API和C语言拓展的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: word怎么利用MathType实现公式
- 下一篇: 《SAP HANA平台应用开发》—第2章