CUDA简要理解
深入理解請參考:CUDA by Example: An Introduction to General-Purpose GPU Programming
1.CUDA是什么?
CUDA,Compute Unified Device Architecture的簡稱,由NVIDIA公司創立的基于他們公司生產的圖形處理器GPUs(Graphics Processing Units,可以通俗的理解為顯卡)的一個并行計算平臺和編程模型。
通過CUDA,GPUs可以很方便地被用來進行通用計算(有點像在CPU中進行的數值計算。。)。在沒有CUDA前,GPUs一般只用來進行圖形渲染(如通過OpenGL,DirectX等接口)。開發人員可以通過調用CUDA的API,來進行并行編程,達到高性能計算目的。
NVIDIA公司為了吸引更多的開發人員,對CUDA進行了編程語言擴展,如CUDA C/C++,CUDA Fortran語言。注意CUDA C/C++可以看作一個新的編程語言,因為NVIDIA配置了相應的編譯器nvcc,CUDA Fortran一樣。更多信息可以參考文獻。
2.CUDA C的理解
簡單的認為C語言工作的對象是CPU和內存條(下文稱為主機內存),那么CUDA C工作的的對象就是GPU及GPU上的內存(下文稱為設備內存),且充分利用了GPU多核的優勢及降低了并行編程的難度。
過程:一般通過C語言把數據從外界讀入,再分配數據,給CUDA C,以便在GPU上計算,然后再把計算結果返回給C語言,以便進一步工作,如進一步處理及顯示,或重復此過程。
3. 深入概念理解
主機:將CPU及系統的內存(內存條)稱為主機。
設備:將GPU及GPU本身的顯示內存稱為設備。
線程(Thread):一般通過GPU的一個核進行處理。(可以表示成一維,二維,三維)。
線程塊(Block):
1. 由多個線程組成(可以表示成一維,二維,三維。。)。
2. 各block是并行執行的,block間無法通信,也沒有執行順序。
3. 注意線程塊的數量限制為不超過65535(硬件限制)。
線程格(Grid):
每個線程格Grid由若干個線程塊(block)組成(可以表示成一維,二維,三維等),而每個線程塊block又由若干個線程(thread)組成。
線程束:
在CUDA架構中,線程束是指一個包含32個線程的集合,這個線程集合被“編織在一起”并且“步調一致”的形式執行。在程序中的每一行,線程束中的每個線程都將在不同數據上執行相同的命令。
核函數(Kernel):
1. 在GPU上執行的函數通常稱為核函數。
2. 一般通過標識符__global__修飾,調用通過<<<參數1,參數2>>>,用于說明內核函數中的線程數量,以及線程是如何組織的。
3. 以線程格(Grid)的形式組織.
4. 是以block為單位執行的。
5. 能在主機端代碼中調用。
6. 調用時必須聲明內核函數的執行參數。
7. 編程時,必須先為kernel函數中用到的數組或變量分配好足夠的空間,再調用kernel函數,否則在GPU計算時會發生錯誤,例如越界或報錯,甚至導致藍屏和死機。
更多的gpu編程詳見下方keyword:
dim3結構類型定義;函數修飾符(__global__/__device__);常用的GPU內存函數 cudaMemcpy()/cudaMalloc()/cudaFree();cuda內存分類(全局內存、共享內存、常量內存、紋理內存、固定內存);
常用線程操作函數__syncthreads();時間測量性能的用途和形式;CUDA流是如何實現并發?
Refer:
http://cist.buct.edu.cn/staff/zheng/gpgpu/
http://blog.csdn.net/zkl99999/article/details/50708184
總結
- 上一篇: 地下城与勇士:起源古拉德的火焰腰带装备图
- 下一篇: zip压缩工具 tar打包 打包并压缩