Ubuntu 9.04下CUDA編程起步
前一陣子把蟻群算法和改進(jìn)的K-Means算法都搞定了,然后一直在看CUDA編程,前面看CUDA的介紹,一直認(rèn)為會(huì)C之后CUDA就很容易上手,其實(shí)不然,還需要了解一些GPU的體系結(jié)構(gòu)相關(guān)的知識才能寫出好的程序來?!禛PU高性能運(yùn)算之CUDA》這本書看完一遍之后感覺它更像一個(gè)手稿整理,把之前的恒多文檔整理了一下出了一本書,因?yàn)槭羌蠹业闹腔郏v的還不錯(cuò),就是順序上安排的不是太好。有總比沒有好,看過一遍之后,對CUDA編程還是有一些底氣的。推薦新手也先看看。
看書歸看書,寫程序是另外一件事情,上一篇文章里把環(huán)境搭建起來了,可是我還是不知道怎么創(chuàng)建CUDA工程,怎么動(dòng)手開始寫程序。還好CUDA提供了一個(gè)SDK,里面有很多的實(shí)例可以供我們參考,于是乎,我的***個(gè)CUDA程序就從這里開始了。
CUDA SDK的實(shí)例都在src目錄下,每一個(gè)實(shí)例都有一個(gè)自己的目錄,例如deviceuery,在它的目錄下還有一個(gè)編譯時(shí)候使用的Makefile文件,這是編譯單個(gè)項(xiàng)目的?,F(xiàn)在我們將所有實(shí)例都編譯一遍,在CUDA_SDK根目錄下運(yùn)行sudo make之后,可以在 /bin/linux/release下看到編譯之后的可執(zhí)行程序,運(yùn)行即可看到結(jié)果。
這是deviceQuery的運(yùn)行結(jié)果:
那么到這里相信讀者應(yīng)該想到了我們完全可以利用這些實(shí)例來創(chuàng)建我們自己的工程。再實(shí)例中有一個(gè)template,將該目錄下src中的.cu、.cpp文件刪除,將obj目錄下的內(nèi)容清空,這就成為一個(gè)空的CUDA工程,可以再src下編寫程序,然后在Makefie中將編譯的文件名修改正確,編譯即可。所生成的執(zhí)行文件在CUDA_SDK_HOME/bin/linux/release下。這里是一個(gè)測試代碼,執(zhí)行矩陣加法運(yùn)算的:
1 #include
2 #include
3 #include
4 #include
5 #include
6
7 #define VEC_SIZE 16
8
9 //kernel function
10 __global__ void vecAdd(float* d_A,float* d_B,float* d_C)
11 {
12 int index=threadIdx.x;
13 d_C[index]=d_A[index]+d_B[index];
14 }
15
16 int main()
17 {
18 //得到分配空間的大小
19 size_t size=VEC_SIZE*sizeof(float);
20
21 //為本地分配內(nèi)存
22 float* h_A=(float*)malloc(size);
23 float* h_B=(float*)malloc(size);
24 float* h_C=(float*)malloc(size);
25
26 //初始化
27 for (int i=0;i 28 { 29 h_A[i]=1.0; 30 h_B[i]=2.0; 31 } 32 33 //將本地內(nèi)存的中的數(shù)據(jù)復(fù)制到設(shè)備中 34 float* d_A; 35 cudaMalloc((void**)&d_A,size); 36 cudaMemcpy(d_A,h_A,size,cudaMemcpyHostToDevice); 37 38 float* d_B; 39 cudaMalloc((void**)&d_B,size); 40 cudaMemcpy(d_B,h_B,size,cudaMemcpyHostToDevice); 41 42 //分配存放結(jié)果的空間 43 float* d_C; 44 cudaMalloc((void**)&d_C,size); 45 46 //定義16個(gè)線程 47 dim3 dimblock(16); 48 vecAdd<<<1,dimblock>>>(d_A,d_B,d_C); 49 50 //講計(jì)算結(jié)果復(fù)制回主存中 51 cudaMemcpy(h_C,d_C,size,cudaMemcpyDeviceToHost); 52 53 //輸出計(jì)算結(jié)果 54 for (int j=0;j 55 { 56 printf("%f\t",h_C[j]); 57 } 58 59 //釋放主機(jī)和設(shè)備內(nèi)存 60 cudaFree(d_A); 61 cudaFree(d_B); 62 cudaFree(d_C); 63 64 free(h_A); 65 free(h_B); 66 free(h_C); 67 68 return 0; 69 } 【編輯推薦】