最近、カーネルが起動する前にグローバルメモリの初期化が必要なコードを作成しています。私は各カーネルが起動する前にcudaMemset
をやっていました。しかし、このカーネルを何千回も呼び出す必要がある場合、オーバーヘッドは無視できません。だから私は最終的にすべての初期化作業が完了したかどうかを判断するためにグローバルメモリを使用するという考え方を思いつきます。しかし、私はすぐにアクティブなブロック内のいくつかのスレッドがループを行っているとき、次のブロックは起動し続けず、結果としてデッドループになります。CUDAカーネルでブロック同期を実行する可能性のある方法
int i = blockIdx.x * blockDim.x + threadIdx.x;
if (i < (n + n)) {
data[i] = 0;
}//working.
__syncthreads();//sync
if (threadIdx.x == 0) {
atomicAdd((unsigned *)&flag, 1);//voting
while (flag < gridDim.x); //waiting
}
}
__syncthreads();
//do something with data
手動で現在のブロックをスリープ状態にしてカーネルを起動させる方法はありますか?または私の初期化の問題のためのより良い解決策はありますか?