Mersenne Twister
( MT
) 乱数ジェネレーターの CUDA の実装は、スレッド/ブロック256
および200
ブロック/グリッドの最大数に制限されています。つまり、スレッドの最大数は です51200
。
そのため、MT を使用するカーネルを で起動することはできません。
kernel<<<blocksPerGrid, threadsPerBlock>>>(devMTGPStates, ...)
どこ
int blocksPerGrid = (n+threadsPerBlock-1)/threadsPerBlock;
およびn
はスレッドの総数です。
MT
forを使用する最良の方法は何threads > 51200
ですか?
blocksPerGrid
とに定数値を使用する場合の私のアプローチthreadsPerBlock
、たとえば<<<128,128>>>
、カーネルコードで次を使用します。
__global__ void kernel(curandStateMtgp32 *state, int n, ...) {
int id = threadIdx.x+blockIdx.x*blockDim.x;
while (id < n) {
float x = curand_normal(&state[blockIdx.x]);
/* some more calls to curand_normal() followed
by the algorithm that works with the data */
id += blockDim.x*gridDim.x;
}
}
これが正しい方法なのか、MT のステータスに望ましくない影響を与える可能性があるのか、よくわかりません。
ありがとうございました。