CUDA(四) CUDA 库函数-----随机数生成cuRAND

此博客为博主的自学笔记 ,欢迎大家共同交流,如果有错误的地方欢迎留言指正。

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_XORWOWXORWOW
CURAND_RNG_PSEUDO_MRG32K3AMRG32k3a
CURAND_RNG_PSEUDO_MTGP32梅森・费尔拖斯特
CURAND_RNG_QUASI_SOBOL32Sobol32
CURAND_RNG_QUASI_SCRAMBLED_SOBOL64Scrambled Sobol64
CURAND_RNG_QUASI_DEFAULTXORWOW
(注:本人对算法类型之间的区别的理解度为0)

为生成算法设定初始值

使用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);   //释放主机侧内存空间


}



评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值