核函數(Kernel)
1.在GPU上執行的函數通常稱爲核函數。
2.一般通過標識符__global__修飾,調用通過<<<參數1,參數2>>>,用於說明內核函數中的線程數量,以及線程是如何組織的。
3.以線程格(Grid)的形式組織,每個線程格由若干個線程塊(block)組成,而每個線程塊又由若干個線程(thread)組成。
4.是以block爲單位執行的。
5.叧能在主機端代碼中調用。
6.調用時必須聲明內核函數的執行參數。
7.在編程時,必須先爲kernel函數中用到的數組或變量分配好足夠的空間,再調用kernel函數,否則在GPU計算時會發生錯誤,例如越界或報錯,甚至導致藍屏和死機。
/* * @file_name HelloWorld.cu 後綴名稱.cu */
#include <stdio.h> #include <cuda_runtime.h> //頭文件
//核函數聲明,前面的關鍵字__global__ __global__ void kernel( void ) { }
int main( void ) { //核函數的調用,注意<<<1,1>>>,第一個1,代表線程格里只有一個線程塊;第二個1,代表一個線程塊裏只有一個線程。 kernel<<<1,1>>>(); printf( "Hello, World!\n" ); return 0; }
|
dim3結構類型
1.dim3是基亍uint3定義的矢量類型,相當亍由3個unsignedint型組成的結構體。uint3類型有三個數據成員unsigned int x; unsignedint y; unsigned int z;
2.可使用亍一維、二維或三維的索引來標識線程,構成一維、二維或三維線程塊。
3.dim3結構類型變量用在覈函數調用的<<<,>>>中。
4.相關的幾個內置變量
4.1.threadIdx,顧名思義獲取線程thread的ID索引;如果線程是一維的那麼就取threadIdx.x,二維的還可以多取到一個值threadIdx.y,以此類推到三維threadIdx.z。
4.2.blockIdx,線程塊的ID索引;同樣有blockIdx.x,blockIdx.y,blockIdx.z。
4.3.blockDim,線程塊的維度,同樣有blockDim.x,blockDim.y,blockDim.z。
4.4.gridDim,線程格的維度,同樣有gridDim.x,gridDim.y,gridDim.z。
5.對於一維的block,線程的threadID=threadIdx.x。
6.對於大小爲(blockDim.x, blockDim.y)的 二維 block,線程的threadID=threadIdx.x+threadIdx.y*blockDim.x。
7.對於大小爲(blockDim.x, blockDim.y, blockDim.z)的 三維block,線程的threadID=threadIdx.x+threadIdx.y*blockDim.x+threadIdx.z*blockDim.x*blockDim.y。
8.對於計算線程索引偏移增量爲已啓動線程的總數。如stride = blockDim.x * gridDim.x;threadId += stride。