我有關於在網格中控制線程塊的問題。使用CUDA可以在網格中選擇一些塊嗎?
我的源代碼是對圖像的遞歸作業。但在處理中,許多區塊滿足約8倍的結束條件。只有幾個塊導致執行循環超過16次。所以我想跳過滿足執行結束條件的塊。
這是可能的嗎?
__global__ main(){
/* previous */
int *blockMap;
cudaMalloc((void**)&blockMap, sizeof(int) * nXBlockNum * nYBlockNum);
cudaMemset((void**)&blockMap, 0, sizeof(int) * nXBlockNum * nYBlockNum);
kernel<<<nblocks, nthreads>>>(inputimage, outputbuffer, blockmap);
/* after */}
__global__
kernel(byte* inputeimage, byte* outputbuffer, int* blockmap) {
__shared__ int *skipFlag;
if((blockDim.x * threadIdx.y + threadIdx.x) == 0)
{
*skipFlag = g_bMap[blockIdx.y * gridDim.x + blockIdx.x];
}
if(*skipFlag == 0)
{
/* recursive job */
}
}
你是什麼意思?如果你有'if'條件,你可以繼續只運行活動塊。即使使用塊內的線程,也可以這樣做。 – 2013-03-15 14:35:00
簡單的方法是爲所有線程大小聲明標誌。但我想使用具有塊大小的標誌變量。所以我宣佈標誌變量在全局內存中,比使用塊索引,以便它不運行。但在運行時間,它似乎是死鎖狀態。 – user2174291 2013-03-15 14:47:34