可以用CUDA选择网格中的一些块吗?

时间:2013-03-15 14:32:17

标签: 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 */
    }
}

2 个答案:

答案 0 :(得分:1)

是的,你可以这样做,但你展示的内核代码并不完全是这样做的。假设您希望每个块都有一个整数标志,那么代码应该类似于:

__global__
kernel(byte* inputeimage, byte* outputbuffer, int* blockmap) {
    __shared__ int skipFlag;


    if (threadIdx.x == 0)
    {
        skipFlag = g_bMap[blockIdx.x];
    }
    __syncthreads();

    if(skipFlag == 0)
    {
              /* recursive job */
    }
}

这里,每个块中的第一个线程从全局加载该特定块的标志,并将其存储到共享内存整数变量中。在块同步之后,每个线程都可以读取该值并相应地对其进行操作。

答案 1 :(得分:0)

我不太了解你的问题,但这种方式似乎是正确的。每个块在其共享内存中都有一个唯一的skipFlag,而那些得到true的块不会执行其余的代码。

并且,两个ifs之间的__syncthreads()可能是一个好主意。