私がこのマクロを最初に読んだときに私が困惑したことは、「なぜこれはループですか、既に並列化されているカーネル内ではありませんか?答えは、GPUが実際にサポートするスレッドよりも多くのスレッドがある場合、ループがケースを処理するということです。
たとえば、並列化されたベクトルの追加を行い、GPUの場合、ブロックごとに512スレッドを使用し、最大4096ブロックのスケジューリングを行うと決めました(これらはCaffe2のデフォルトパラメータです)。つまり、最大2097152スレッドのスケジューリングのみが可能です。ベクトルに実際に4M要素があるとします。今では要素ごとに実際にスレッドを割り当てることはできません。したがって、各スレッドは、ベクトル内の複数の要素を合計する必要があります。これがこのループの目的です。
ここでは、仕事のスケジュール設定の仕方を正確に示す小さな例です。 blockDim.x == 2
,gridDim.x == 2
,nthreads == 7
とする。次に、GPUスレッドを(blockIdx.x, threadIdx.x)
と指定した場合、ベクトル上で次の処理を行うように割り当てます。[(0,0), (0,1), (1,0), (1,1), (0,0), (0,1), (1,0)]
特に、グリッドサイズに応じて、使用できるGPUスレッドは4つしかないことがわかります。したがって threadIdx.x == 0
の場合、index
は、BOTH 0
と4
のベクトル要素の処理を処理します。