CUDA または pyCUDA での乱数生成の典型的な例は、質問How to generate random number inside pyCUDA kernel?で報告されています。、すなわち
#include <curand_kernel.h>
const int nstates = %(NGENERATORS)s;
__device__ curandState_t* states[nstates];
__global__ void initkernel(int seed)
{
int tidx = threadIdx.x + blockIdx.x * blockDim.x;
if (tidx < nstates) {
curandState_t* s = new curandState_t;
if (s != 0) {
curand_init(seed, tidx, 0, s);
}
states[tidx] = s;
}
}
__global__ void randfillkernel(float *values, int N)
{
int tidx = threadIdx.x + blockIdx.x * blockDim.x;
if (tidx < nstates) {
curandState_t s = *states[tidx];
for(int i=tidx; i < N; i += blockDim.x * gridDim.x) {
values[i] = curand_uniform(&s);
}
*states[tidx] = s;
}
}
この古典的な例を使用すると、起動される乱数発生器 ( XORWOW
、MTGP32
、その他) は何ですか?
カーネル内から乱数ジェネレーターを変更するにはどうすればよいですか?