Реализация CUDA генератора случайных чисел Mersenne Twister
(MT
) ограничена максимальным количеством потоков/блоков из 256
и 200
блоков/сетки, т. е. максимальное количество потоков равно 51200
.
Поэтому невозможно запустить ядро, использующее МТ с
kernel<<<blocksPerGrid, threadsPerBlock>>>(devMTGPStates, ...)
куда
int blocksPerGrid = (n+threadsPerBlock-1)/threadsPerBlock;
а n
— общее количество потоков.
Как лучше всего использовать MT
для 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?
Спасибо.