如何在我的 CUDA 内核中编写由单线程执行的语句。例如,如果我有以下内核:
__global__ void Kernel(bool *d_over, bool *d_update_flag_threads, int no_nodes)
{
int tid = blockIdx.x*blockDim.x + threadIdx.x;
if( tid<no_nodes && d_update_flag_threads[tid])
{
...
*d_over=true; // writing a single memory location, only 1 thread should do?
...
}
}
在上面的内核中,“d_over”是一个布尔标志,而“d_update_flag_threads”是一个布尔数组。
我之前通常做的是使用线程块中的第一个线程,例如:
if(threadIdx.x==0)
但在这种情况下它无法工作,因为我在这里有一个标志数组,只有带有关联标志“true”的线程才会执行 if 语句。该标志数组是由之前调用的另一个 CUDA 内核设置的,我事先对此一无所知。
简而言之,我需要类似于 OpenMP 中的“Single”构造的东西。