cuRAND

来源:互联网 发布:鼠标评测软件 编辑:程序博客网 时间:2024/05/16 19:52

CUDA提供了若干个高速的库函数,先介绍一下比较简单的符点型随机数生成函数——-cuRAND
cuRAND库函数分为可以在GPU的核函数中使用的API(即被device关键字修饰的函数)和在主机侧被使用的API(其实内部由GPU的API组成)两种。本次我只介绍被主机侧使用的API。
在主机侧使用随机数生成的库函数大致分为三个步骤:
1,声明随机数指针,指定随机数生成算法。
2,为生成算法设定初始值。
3,指定随机数生成个数,生成随机数,并保存在global memory中。
声明随机数指针,指定随机数生成算法
使用curandGenerator_t 生成相应的随机数指针,使用curandCreateGenerator(curandGenerator_t* generator, curandRngType_t rng_type)
指定随机数生成算法。
generator: 指向随机数的指针变量。
rng_type:算法类型
举列7种算法类型(部分) :
宏定义 算法类型
CURAND_RNG_PSEUDO_XORWOW XORWOW
CURAND_RNG_PSEUDO_MRG32K3A MRG32k3a
CURAND_RNG_PSEUDO_MTGP32 梅森・费尔拖斯特
CURAND_RNG_QUASI_SOBOL32 Sobol32
CURAND_RNG_QUASI_SCRAMBLED_SOBOL64 Scrambled Sobol64
CURAND_RNG_QUASI_DEFAULT XORWOW
为生成算法设定初始值
使用curandSetPseudoRandomGeneratorSeed(curandGenerator_t generator, unsigned long long seed)
generator: 随机数变量
seed: 初始值
在这里说明一下指定初始值的意义:因为所有的随机数生成算法都是按照即定的顺序来生成随机数,所以,如果不设定初值或者不改变初始值的话。那每次生成的随机数将不会发生改变。
指定随机数生成个数,生成随机数,并保存在global memory中
使用curandGenerateUniform(curandGenerator_t generator, float* outputPtr, size_t num)函数来生成多个随机数,并将它们存放到global memory中
generator:随机数变量
outputPtr:global memory的首地址,将global memory做为随机数的缓冲器
num:生成随机数的个数

最后,需使用curandDestroyGenerotor将生成的随机数指针变量释放掉.


>
#include< stdio.h>
#include< stdlib.h>
#include< math.h>
#include< cuda_runtime.h>
#include< curand.h>
#include< helper_cuda.h>
#include< helper_timer.h>

#pragma comment(lib, “cudart.lib”)
#pragma comment(lib, “curand.lib”)

int main()
{
int N = 1024;
curandGenerator_t gen; //生成随机数变量
float *p_d, *p_h;

p_h = (float *)malloc(N*sizeof(float)); //在主机侧声明内存空间

cudaMalloc((void **)&p_d, N*sizeof(float)); //GPU侧声明随机数存储缓冲器的内存空间

curandCreateGenerator(&gen, CURAND_RNG_PSEUDO_MRG32K3A); //步骤1:指定算法

curandSetPseudoRandomGeneratorSeed(gen, 11ULL); //步骤2:随机数初始化

curandGenerateUniform(gen, p_d, N);//步骤3:生成随机数,存储到缓冲器中

cudaMemcpy(p_h, p_d, N*sizeof(float), cudaMemcpyDeviceToHost); //将随机数传送到主机

for(int i = 0; i< N; i++){ //输出结果
printf(“%d, %.4f\n”,i, p_h[i]);
}

curandDestroyGenerator(gen); //释放指针
cudaFree(p_d); //释放GPU侧内存空间
free(p_h); //释放主机侧内存空间
}


原创粉丝点击