cuRAND内核中的随机数生成器的类型

时间:2019-03-21 10:03:27

标签: cuda curand

问题How to generate random number inside pyCUDA kernel?报告了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;
    }
}

使用这个经典示例,激活的随机数生成器是什么(XORWOWMTGP32等)?

如何从内核内部更改随机数生成器?

1 个答案:

答案 0 :(得分:2)

curand设备API中的默认生成器是XORWOW,由定义

typedef struct curandStateXORWOW curandState_t;
设备API标头中的

。您可以通过将另一种状态类型替换为curandInit调用来切换到另一种生成器。请注意,与默认值相比,某些生成器需要curandInit例程使用不同的参数。