CUDA 編程的基本模式- IT閱讀 - ITREAD01.COM - 程式入門教學

文章推薦指數: 80 %
投票人數:10人

( 註: <<<>>>下方編譯器可能顯示語法錯誤,不用管). 5. 從顯存中獲取結果變量。

( cudaMemcpy,cublasGetVector 等函數實現). 6. 釋放申請的顯存空間。

CUDA編程的基本模式 首頁 最新 HTML CSS JavaScript jQuery Python3 Python2 Java C C++ Go SQL 首頁 最新 Search CUDA編程的基本模式 2018-06-10254 理解錯誤lobhtmlhttpPE編寫編號cudareproducedfrom:http://www.cnblogs.com/muchen/p/6306747.html 前言 本文將介紹CUDA編程的基本模式,所有CUDA程序都基於此模式編寫,即使是調用庫,庫的底層也是這個模式實現的。

模式描述   1.定義需要在device端執行的核函數。

(函數聲明前加_golbal_關鍵字) 2.在顯存中為待運算的數據以及需要存放結果的變量開辟顯存空間。

(cudaMalloc函數實現) 3.將待運算的數據傳輸進顯存。

(cudaMemcpy,cublasSetVector等函數實現) 4.調用device端函數,同時要將需要為device端函數創建的塊數線程數等參數傳遞進<<<>>>。

(註:<<<>>>下方編譯器可能顯示語法錯誤,不用管) 5.從顯存中獲取結果變量。

(cudaMemcpy,cublasGetVector等函數實現) 6.釋放申請的顯存空間。

(cudaFree實現) PS:每個device端函數在被調用時都能獲取到調用它的具體塊號,線程號,從而實現並行(獲取方法請參考下面的編程規範說明以及代碼示例)。

編程規範說明 在CUDA標準編程模式中,增加了一些編程規範,在這裏簡要說明:   函數聲明關鍵字:     1.__device__     表明此函數只能在GPU中被調用,在GPU中執行。

這類函數只能被__global__類型函數或__device__類型函數調用。

    2.__global__     表明此函數在CPU上調用,在GPU中執行。

這也是以後會常提到的"內核函數",有時為了便於理解也稱"device"端函數。

    3.__host__     表明此函數在CPU上調用和執行,這也是默認情況。

  內核函數配置運算符<<<>>>-這個運算符在調用內核函數的時候使用,一般情況下傳遞進三個參數:     1.塊數     2.線程數     3.共享內存大小(此參數默認為0)   內核函數中的幾個系統變量-這幾個變量可以在內核函數中使用,從而控制塊與線程的工作:     1.gridDim:塊數     2.blockDim:塊中線程數     3.blockIdx:塊編號(0-gridDim-1)     4.threadIdx:線程編號(0-blockDim-1)   知道這些已經足夠編寫CUDA程序了,更多的編程說明將在以後的文章中介紹。

代碼示例 該程序采用CUDA並行化思想來對數組進行求和: 1//相關CUDA庫 2#include"cuda_runtime.h" 3#include"cuda.h" 4#include"device_launch_parameters.h" 5 6#include 7#include 8 9usingnamespacestd; 10 11constintN=100; 12 13//塊數 14constintBLOCK_data=3; 15//各塊中的線程數 16constintTHREAD_data=10; 17 18//CUDA初始化函數 19boolInitCUDA() 20{ 21intdeviceCount; 22 23//獲取顯示設備數 24cudaGetDeviceCount(&deviceCount); 25 26if(deviceCount==0) 27{ 28cout<=1)//cuda計算能力 39{ 40break; 41} 42} 43} 44 45if(i==deviceCount) 46{ 47cout<>>(gpudata,result); 107 108//在內存中為計算對象開辟空間 109int*sumArray=newint[THREAD_data*BLOCK_data]; 110//從顯存獲取處理的結果 111cudaMemcpy(sumArray,result,sizeof(int)*THREAD_data*BLOCK_data,cudaMemcpyDeviceToHost); 112 113//釋放顯存 114cudaFree(gpudata); 115cudaFree(result); 116 117//計算GPU每個線程計算出來和的總和 118intfinal_sum=0; 119for(inti=0;i筆記二) 企業應用架構的基本模式之入口模式 企業應用架構的基本模式之分離介面 Java進階面試題列表面向對象編程的基本理念與核心設計思想 網絡編程的基本概念,TCP/IP協議簡介 Jsp編程的基礎模型 程式設計師日常編碼的基本素養 MySql儲存過程中的基本函式和需要用到的運算子 WiFi聯網的兩種工作方式:點對點與基本模式 建立物件(二)——三種基本模式的組合使用 MySQL儲存過程中的3種迴圈,儲存過程的基本語法,ORACLE與MYSQL的儲存過程/函式的使用區別,退出儲存過程方法 Vim入門教程:基本模式 Java並發編程系列(一)-線程的基本使用 13並發編程-(協程)-協程的基本概念 分類導航 HTML/CSS HTML教程 HTML5教程 CSS教程 CSS3教程 JavaScript JavaScript教程 jQuery教程 Node.js教程 服務端 Python教程 Python3教程 Linux教程 Docker教程 Ruby教程 Java教程 JSP教程 C教程 C++教程 Perl教程 Go教程 PHP教程 正則表達式 資料庫 SQL教程 MySQL教程 PostgreSQL教程 SQLite教程 MongoDB教程 Redis教程 Memcached教程 行動端 IOS教程 Swift教程 Advertisement 三度辭典 Copyright©2016-2021IT閱讀  Itread01.comAllRightsReserved. 0.001291036605835



請為這篇文章評分?