【平行運算】CUDA教學(一) 概念介紹 - 都會阿嬤
文章推薦指數: 80 %
都會阿嬤- 現在大部份做深度學習的工程師視CUDA、GPU加速為黑盒子, ... 在CUDA 中,最基本的運算單元是thread,很多thread 組成一個block,很多block 組成一個gird ...
Skiptocontent
觀看次數:
9,457
現在大部份做深度學習的工程師視CUDA、GPU加速為黑盒子,但若你能了解CUDA,這就是你比90%的人還要厲害的關鍵。
CUDA(ComputeUnifiedDeviceArchitecture,統一計算架構)是NVIDIA研發的平行運算平台及編程模型,可利用繪圖處理單元(GPU)的能力大幅提升運算效能。
目前最流行的深度學習,在訓練類神經網路時因為牽涉到大量的運算,也是使用CUDA等平行運算技術來進行加速。
目前主流的Tensorflow、Pytorch等深度學習框架也大量了使用CUDA。
也正是因為GPU的運算效能,才讓深度學習可以有今天的表現。
因此了解GPU、CUDA、平行運算的技術是非常重要的!
1.CUDA平行加速工作流程
在host(CPU)配置記憶體並初始化資料在device(GPU)配置記憶體將資料從host傳送到device(CPU->GPU)在GPU上執行核心程式碼(Kernel)將資料從device傳送回host(GPU->CPU)
上面提到了幾個關鍵字:配置記憶體、資料傳輸、核心程式碼Kernel,以下將一一詳細介紹
2.配置記憶體
記憶體的配置是相當簡單,在CPU上使用malloc(memoryallocation)來配置記憶體,在GPU使用cudaMalloc(cudamemoryallocation)來配置記憶體。
CPU記憶體:
mallocfree
float*Array_CPU;
Array_CPU=(float*)malloc(Array_Size);
free(Array_CPU);
GPU記憶體:
cudaMalloccudaFree
float*Array_GPU;
cudaMalloc(&Array_GPU,Array_Size);
cudaFree(Array_GPU);
3.資料傳輸
無論是從CPU到GPU都是cudaMemcpy這個函式,只需要傳入cudaMemcpyHostToDevice或cudaMemcpyDeviceToHost即可指定是將資料從哪裡複製到哪裡
CPU到GPU(HosttoDevice):
cudaMemcpy()cudaMemcpyHostToDevice
cudaMemcpy(Array_GPU,Array_CPU,Array_Size,cudaMemcpyHostToDevice)
GPU到CPU(DevicetoHost):
cudaMemcpy()cudaMemcpyDeviceToHost
cudaMemcpy(Array_CPU,Array_GPU,Array_Size,cudaMemcpyDeviceToHost)
4.核心程式碼(Kernel)
CUDA讓我們可以自己定義核心程式碼(kernel),當他被呼叫的時候,會被每個thread都執行一次,N個thread執行N次Kernelfunction在定義時要使用globalKernelfunction在呼叫時要使用<<>>並指定block數目,和每個block裡面有多少threads
GPU_Kernel<<
這些index可以是1D、2D或3D,想像成三維座標就可以了要知道每一個thread獨特的座標以指派運算任務,我們會需要block的大小。
假設一個block裡面有4x3的threads(像上圖),則blockDim.x=4,blockDim.y=3
//在一個grid裡面,一個thread的座標(x,y)為:
x=blockDim.x*blockIdx.x+threadIdx.x
y=blockDim.y*blockIdx.y+threadIdx.y
以下這張圖很清楚的介紹了在1D的情況下,thread_id的計算方式:(圖片來源:AnEvenEasierIntroductiontoCUDA)
以下的程式碼執行了矩陣的加法,使用了大小為16x16的block(每個block裡有256個thread),並且使用了numBlcoks個block,這邊block的數目為動態計算,可以針對給訂的資料來決定要使用多少個block
//Kerneldefinition
__global__voidMatAdd(floatA[N][N],floatB[N][N],
floatC[N][N])
{
inti=blockIdx.x*blockDim.x+threadIdx.x;
intj=blockIdx.y*blockDim.y+threadIdx.y;
if(i
延伸文章資訊
- 1【平行運算】CUDA教學(一) 概念介紹 - 都會阿嬤
都會阿嬤- 現在大部份做深度學習的工程師視CUDA、GPU加速為黑盒子, ... 在CUDA 中,最基本的運算單元是thread,很多thread 組成一個block,很多block 組成一個g...
- 2CUDA基本语法 - 简书
示例:向量加的CUDA实现这里通过向量加计算这个例子介绍CUDA的基本知识,主要包括内存操作、核函数(kernel function)以及线程配置等。
- 3CUDA程式設計指南閱讀筆記
CUDA基本概念(上) ... 本節將介紹CUDA的一些基本的程式設計概念,該節用到的例子來自於CUDA Sample中的VectorAdd專案。 ... 執行配置語法來設定。
- 4[07W310]《科管局補助80%》CUDA程式設計與深度學習
平行計算概論與CUDA基本語法。 2.GPU的硬體架構與CUDA程式優化。 3.TensorFlow與深度學習應用。 課程師資:. 自強基金會專業講師學歷:美國馬里蘭大學博士專長:數值 ...
- 5CUDA · parallel_processing
而在device 上執行的function(device 和global)有一些基本的限制:. 不支援遞迴; 不能有static 變數; 不能使用variable number of argum...