Mersenne Twister (MT) 난수 생성기의 CUDA 구현은 256 및 200 블록/격자의 최대 스레드 수/블록으로 제한됩니다. 즉 최대 스레드 수는 51200입니다 .임의의 수의 스레드에 대한 CUDA의 Mersenne Twister
따라서
kernel<<<blocksPerGrid, threadsPerBlock>>>(devMTGPStates, ...)
int blocksPerGrid = (n+threadsPerBlock-1)/threadsPerBlock;
및과 함께 MT를 사용하는 커널을 실행 할 수 없습니다은 총 스레드 수입니다.
스레드> 51200에 MT를 사용하는 가장 좋은 방법은 무엇입니까?
내 접근 방식은 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 상태에 영향을 미칠 수 있다면?
감사합니다.
답장을 보내 주셔서 감사합니다. 한편 나는 그것을 발견했다. 스레드 0에 대한 결과는 스레드 16384에 대한 것과 동일하며, 그래서 내 아이디어는 많은 스레드에서 작동하지 않습니다. 나는 당신의 제안을 묵상하고 그것을 나의 프로그램에 적용하는 방법을 묵상합니다. BTW : 문서에 따르면 XORWOW를 사용하여 1e6 스레드 (예 : 1e6 상태)를 동시에 사용하는 것은 문제가되지 않는다고 결론을 내 렸습니다. 아니면 가능한 제한이 있습니까? – PhillipD
내가 알고있는이 유형의 유일한 한계는 MT에 대한 것입니다. MRG와 XORWOW에는 이러한 유형의 제한이 없어야합니다. –