シングルスレッドで実行されるステートメントを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」コンストラクトに似たものが必要です。