Тип генератора случайных чисел в ядрах cuRAND - PullRequest
1 голос
/ 21 марта 2019

Типичный пример генерации случайных чисел в CUDA или pyCUDA описан в вопросе Как генерировать случайное число внутри ядра 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, другие)?

Как можно изменить генератор случайных чисел из ядра?

1 Ответ

2 голосов
/ 22 марта 2019

Генератором по умолчанию в API устройства curand является XORWOW, как определено

typedef struct curandStateXORWOW curandState_t;

в заголовке API устройства.Вы можете перейти к другому генератору, подставив другой тип состояния в вызов curandInit.Обратите внимание, что некоторым генераторам требуются другие аргументы для подпрограммы curandInit по сравнению со значением по умолчанию.

...