cuda基本概念

核函數(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。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章