我想知道是否有可能啓動一個cuda內核,以便在運行時可以提及網格/塊的大小,而不是像往常一樣編譯時。是否可以在運行時啓動具有gridsize /塊大小的cuda內核?
任何有關這方面的幫助將是非常寶貴的。
我想知道是否有可能啓動一個cuda內核,以便在運行時可以提及網格/塊的大小,而不是像往常一樣編譯時。是否可以在運行時啓動具有gridsize /塊大小的cuda內核?
任何有關這方面的幫助將是非常寶貴的。
在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;
}
Cuda內核和設備函數可以使用blockDim {x,y,z
}來訪問塊配置以及gridDim {x,y,z
}來訪問網格配置。如果你有一個可以處理各種配置的內核/設備功能,你需要做的就是啓動一個內核(myKernel<<<dimGrid,dimBlock>>>
),並在運行時選擇dimGrid
或dimBlock
。我不認爲這是不尋常的。
它不**通常**。在大多數CUDA應用程序中,塊大小在編譯時固定,而網格大小保持動態,具體取決於運行時參數。 – sgarizvi 2013-02-20 05:56:18
@ sgar91請你詳細說明一下好嗎? – SRINI794 2013-02-20 06:00:33