現在主要的並行計算設備有兩種發展趨勢:
(1)多核CPU。
雙核,四核,八核,。。。,72核,。。。,可以使用OpenMP編譯處理方案,就是指導編譯器編譯為多核並行執行。
(2)多線程設備(GP)GPU。
通用GPU,就是顯卡,以nvidia公司的顯卡為主。nvidia使用CUDA編程。
由於畢業的需要,現在開始學習CUDA編程。看了一段時間教程,目前環境已經配好,下面是一個簡單的CUDA程序:
程序實現向量的加法操作,使用了一個block內部的512個線程。
1 #include <stdio.h> 2 #include<cuda_runtime.h> 3 4 //__global__聲明的函數,告訴編譯器這段代碼交由CPU調用,由GPU執行 5 __global__ void add(const int *dev_a,const int *dev_b,int *dev_c) 6 { 7 int i=threadIdx.x; 8 dev_c[i]=dev_a[i]+dev_b[i]; 9 } 10 11 int main(void) 12 { 13 //申請主機內存,並進行初始化 14 int host_a[512],host_b[512],host_c[512]; 15 for(int i=0;i<512;i++) 16 { 17 host_a[i]=i; 18 host_b[i]=i<<1; 19 } 20 21 //定義cudaError,默認為cudaSuccess(0) 22 cudaError_t err = cudaSuccess; 23 24 //申請GPU存儲空間 25 int *dev_a,*dev_b,*dev_c; 26 err=cudaMalloc((void **)&dev_a, sizeof(int)*512); 27 err=cudaMalloc((void **)&dev_b, sizeof(int)*512); 28 err=cudaMalloc((void **)&dev_c, sizeof(int)*512); 29 if(err!=cudaSuccess) 30 { 31 printf("the cudaMalloc on GPU is failed"); 32 return 1; 33 } 34 printf("SUCCESS"); 35 //將要計算的數據使用cudaMemcpy傳送到GPU 36 cudaMemcpy(dev_a,host_a,sizeof(host_a),cudaMemcpyHostToDevice); 37 cudaMemcpy(dev_b,host_b,sizeof(host_b),cudaMemcpyHostToDevice); 38 39 //調用核函數在GPU上執行。數據較少,之使用一個Block,含有512個線程 40 add<<<1,512>>>(dev_a,dev_b,dev_c); 41 cudaMemcpy(&host_c,dev_c,sizeof(host_c),cudaMemcpyDeviceToHost); 42 for(int i=0;i<512;i++) 43 printf("host_a[%d] + host_b[%d] = %d + %d = %d\n",i,i,host_a[i],host_b[i],host_c[i]); 44 cudaFree(dev_a);//釋放GPU內存 45 cudaFree(dev_b);//釋放GPU內存 46 cudaFree(dev_c);//釋放GPU內存 47 return 0 ; 48 }
程序輸出:

