此博客为博主的自学笔记 ,欢迎大家共同交流,如果有错误的地方欢迎留言指正。
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); //释放主机侧内存空间
}