2013-02-20 69 views
2

我想知道是否有可能啓動一個cuda內核,以便在運行時可以提及網格/塊的大小,而不是像往常一樣編譯時。是否可以在運行時啓動具有gridsize /塊大小的cuda內核?

任何有關這方面的幫助將是非常寶貴的。

+0

它不**通常**。在大多數CUDA應用程序中,塊大小在編譯時固定,而網格大小保持動態,具體取決於運行時參數。 – sgarizvi 2013-02-20 05:56:18

+0

@ sgar91請你詳細說明一下好嗎? – SRINI794 2013-02-20 06:00:33

回答

3

在CUDA應用程序中,爲網格指定固定大小決不會非常有用。大部分時間塊大小是固定的,並且網格大小保持動態並且根據輸入數據大小而改變。考慮以下矢量加法的例子。

__global__ void kernel(float* a, float* b, float* c, int length) 
{ 
    int tid = blockIdx.x * blockDim.x + threadIdx.x; 

    //Bound checks inside the kernel 
    if(tid<length) 
     c[tid] = a[tid] + b[tid]; 
} 

int addVectors(float* a, float* b, float* c, int length) 
{ 
    //a, b, c are allocated on the device 

    //Fix the block size to an appropriate value 
    dim3 block(128); 

    dim3 grid; 
    grid.x = (length + block.x - 1)/block.x; 

    //Grid size is dependent on the length of the vector. 
    //Total number of threads are rounded up to the nearest multiple of block size. 
    //It means total number of threads are at least equal to the length of the vector. 

    kernel<<<grid,block>>>(a,b,c,length); 

    return 0; 
} 
+0

這意味着如果vector的長度爲1000,將會有8個塊以128個線程啓動。這使得網格的大小爲1024個線程。偉大的答案! :) – SRINI794 2013-02-20 06:23:28

+0

可能問題的upvote會很好:) – SRINI794 2013-02-20 06:26:14

+0

這是正確的。這就是爲什麼在內核中執行綁定檢查的原因,以便額外的24個線程不會執行任何內存讀/寫操作。 – sgarizvi 2013-02-20 06:26:41

2

Cuda內核和設備函數可以使用blockDim {x,y,z}來訪問塊配置以及gridDim {x,y,z}來訪問網格配置。如果你有一個可以處理各種配置的內核/設備功能,你需要做的就是啓動一個內核(myKernel<<<dimGrid,dimBlock>>>),並在運行時選擇dimGriddimBlock。我不認爲這是不尋常的。