我对网格中的控制线程块有疑问。
我的来源是图片上的递归作业。但在处理过程中,许多块满足终止条件约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 */
}
}
答案 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()
可能是一个好主意。