cuRAND 内核中随机数生成器的类型
The type of random number generator in cuRAND kernels
问题中报告了CUDA或pyCUDA中随机数生成的典型例子,即
#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
、其他)?
如何从内核中更改随机数生成器?
curand 设备 API 中的默认生成器是 XORWOW,如
所定义
typedef struct curandStateXORWOW curandState_t;
在设备中 API header。您可以通过将另一个状态类型替换为 curandInit
调用来更改为另一个生成器。请注意,与默认值相比,某些生成器需要 curandInit
例程的不同参数。
问题
#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
、其他)?
如何从内核中更改随机数生成器?
curand 设备 API 中的默认生成器是 XORWOW,如
所定义typedef struct curandStateXORWOW curandState_t;
在设备中 API header。您可以通过将另一个状态类型替换为 curandInit
调用来更改为另一个生成器。请注意,与默认值相比,某些生成器需要 curandInit
例程的不同参数。