1. 程式人生 > >CUDA下的GPU程式設計入門--第一個CUDA程式

CUDA下的GPU程式設計入門--第一個CUDA程式

CUDA是NVIDIA公司開發的一個用於GPU程式設計的開源框架,用於將GPU用於更廣泛的數學計算,充當cpu的功能,所以只能在nvidia的GPU下實現,如果你的GPU不是nvidia的,趕緊去換一個吧,ATI也有一個類似的框架,叫做streaming,不過要用匯編寫。CUDA只需擁有C語音功底就夠了。

CUDA C只是C語言的擴充套件,多了一些包,只要安裝好CUDA工具箱(編譯GPU程式碼的編譯器)就可以在VSIDE下就能編譯和執行。

還可以下載GPU Computing SDK程式碼集,也是一個很好的學習資源。

CUDA程式可以分為兩部分:GPU執行的程式碼和CPU執行的程式碼,兩者可以互不干擾,可以通過cudaMemcpy()函式把GPU的相應記憶體塊複製到主存的相應位置,或者相反過程,實現GPUCPU的資料互動。CPU的記憶體叫做主存,GPU的裡面也有記憶體,可以叫他裝置記憶體。

由於GPU是為圖形設計的,具有強大的3維渲染等技術,所以對於多維陣列的計算是有強大的能力的。

GPU

可以像CPU一樣進行計算工作,同樣具備多執行緒,並且執行緒還是多維執行緒,計算能力超強,而且可以與CPU的計算一起相互協作,從而實現多核CPU計算的效果。

一個簡單的傳遞引數給GPU計算的程式碼:

#include <stdio.h>
#include "../common/book.h"

__global__ void add(int a,int b,int *c)//__global__宣告的函式,告訴編譯器這段程式碼交由GPU執行
{
    *c=a+b;
}

int main(void)
{
	int c;
	int *dev_c;
	HANDLE_ERROR(cudaMalloc( (void**)&dev_c,sizeof(int) ) );//cudaMalloc()函式讓GPU分配記憶體給某個指標
	
	add<<<1,1>>>(2, 7, dev_c);//讓GPU啟動一個執行緒來執行add()函式,函式的變數必須是保持在GPU上的

	HANDLE_ERROR(cudaMemcpy(&c,dev_c,sizeof(int),cudaMemcpyDeviceToHost) );//將GPU的某塊記憶體複製回CPU
	printf("2 + 7 = %d\n",c);
	cudaFree(dev_c);//釋放GPU記憶體

	return 0 ;
};


 HANDLE_ERROR()是我們定義的巨集。判斷是否返回了一個錯誤值。

一定不能在主機程式碼中對裝置指標進行解引用,主機程式碼可以將這個指標作為引數傳遞,對其執行算術運算,甚至可以將其轉換為另外一種不同的型別,但是絕對不能使用這個指標來讀取或者寫入記憶體。

裝置指標的使用限制:

1,可以將cudaMalloc()分配的指標傳遞給在裝置上執行的函式。

2,可以將裝置程式碼中使用cudaMalloc()分配的指標進行記憶體讀、寫操作。

3,可以將cudaMalloc()分配的指標傳遞給在主機上執行的函式。

4,不能在主機程式碼中使用cudaMalloc()分配的指標進行記憶體讀、寫操作。