Cuda是Nvidia發布的並行計算框架,GPU的工作早已不局限於處理圖形圖像,它所包含的大量的計算單元用來執行那些計算量大但可以並行處理的任務。
Cuda的操作概括來說包含5個步驟:
1.CPU在GPU上分配內存:cudaMalloc;
2.CPU把數據發送到GPU:cudaMemcpy;
3.CPU在GPU上啟動內核(kernel),它是自己寫的一段程序,在每個線程上運行;
4.CPU把數據從GPU取回:cudaMemcpy;
5.CPU釋放GPU上的內存。
其中關鍵是第3步,能否寫出合適的kernel,決定了能否正確解決問題和能否高效的解決問題。
Cuda對線程做了合適的規划,引入了grid和block的概念,block由線程組成,grid由block組成,一般說blocksize指一個block放了多少thread;gridsize指一個grid放了多少個block。
一個kernel結構如下:Kernel<<<Dg, Db, Ns, S>>>(param1, param2, ...)
-Dg:grid的尺寸,說明一個grid含有多少個block,為dim3類型,一個grid最多含有65535*65535*65535個block,Dg.x,Dg.y,Dg.z最大值為65535;
-Db:block的尺寸,說明一個block含有多上個thread,為dim3類型,一個block最多含有1024(cuda2.x版本)個threads,Db.x和Db.y最大值為1024,Db.z最大值64;
(舉個例子,一個block的尺寸可以是:1024*1*1 | 256*2*2 | 1*1024*1 | 2*8*64 | 4*4*64等)
-Ns:可選參數,如果kernel中由動態分配內存的shared memory,需要在此指定大小,以字節為單位;
-S:可選參數,表示該kernel處在哪個流當中。
可參見:
關於cuda版本信息:http://blog.cuvilib.com/2010/06/09/nvidia-cuda-difference-between-fermi-and-previous-architectures/
blocksize大小:http://stackoverflow.com/questions/5062781/cuda-max-threads-in-a-block
gridsize大小:http://stackoverflow.com/questions/6048907/maximum-blocks-per-gridcuda