原创作品,如要转载请注明出处:http://www.cnblogs.com/shrimp-can/p/6590152.html

最近要在device函数中使用curand库生成随机数,查找了下资料,除了NVIDIA官网的介绍外,其他介绍deviceAPI的我没有找到,倒是介绍hostAPI的一大堆,因此简单整理下自己所理解的deviceAPI的使用。

一、简介

curand由两部分组成:host端的库和device端的头文件。

host端的库就像其他的CPU库一样curand.h,随机数可以在设备端生成或者CPU端生成。在设备端生成的时候,对库的调用发生在host端,但是随机数的生成实际上发生在device端,随机数存储在global memory中,用户可以调用kernel直接使用这个随机数,也可以将此随机数拷贝回kernel。

device端的库头文件curand_kernel.h,这个头文件里面定义了设置随机数生成器的状态以及生成一系列随机数的设备函数,使得kernel可以调用函数生成随机数,而不需要从global memory处读写。

二、device API

包含头文件curand_kernel.h,工程需要链接到库curand。

使用curand的deviceAPI生成随机数主要需要三个步骤

a.创建一个随机算法状态的对象,如curandState state

b.对状态进行初始化,使用curand_init()函数

c.生成随机数,使用curand等

deviceAPI的作用也是这些,下面进行更详细的介绍

1.创建随机算法状态对象

在deviceAPI中,有4中为随机算法,4种真随机算法

伪随机算法     对应的状态

Mtgp32                       curandStateMtgp32_t

MRG32k3a                 curandStateMRG32k3a_t

Philox4_32_10           curandStatePhilox4_32_10_t

XORWOW                  curandStateWORWOW_t

真随机算法     对应的状态

scrambled Sobol64     curandStateScrambledSobol64_t

Sobol64                    curandStateSobol64_t

scrambled Sobol32     curandStateScrambledSobol32_t

Sobol32                    curandStateSobol32_t

如要创建算法XORWOW状态对象:curandStateWORWOW_t   state

2.对算法状态进行初始化

curand_init()函数,不同的算法,函数的参数不相同,具体算法所需要的参数可以看NVIDIA官网curand_initAPI:http://docs.nvidia.com/cuda/curand/group__DEVICE.html#group__DEVICE

对于除了MTGP32的伪随机算法,初始化参数都是:种子、序列、偏移、要初始化的随机算法状态对象

注意:算法MTGP32的初始化是通过两个hostAPI,curandMakeMTGP32Constants和cirandMakeMTGP32KernelState

如要初始化算法XORWOW状态对象:curand_init ( unsigned long long seed, unsigned long long subsequence, unsigned long long offset, curandStateXORWOW_t* state )

3.生成随机数

生成随机数除了可以使用不同的算法(由参数决定)以外,还能生成不同分布、不同浮点类型的随机数,这根据调用的生成随机数的API决定。

主要有以下几种API:

curand                                                  生成unsigned int型整数,没有特殊分布

curand_uniform                                    生成服从均匀分布的float

curand_uniform4                                  生成4个服从均匀分布的float

curand_uniform_double                     生成服从均匀分布的double

curand_uniform2_double                     生成2个服从均匀分布的double

curand_poisson                                 生成服从泊松分布的int

curand_poisson4                               生成4个服从泊松分布的int

curand_normal                                  生成服从正态分布的float

curand_normal2                                生成2个服从正态分布的float

curand_normal4                                生成4个服从正态分布的float

curand_normal_double                     生成服从正态分布的double

curand_normal2_double                   生成2个服从正态分布的double

curand_log_normal                           生成服从对数正态分布的float

curand_log_normal2                           生成2个服从对数正态分布的float

curand_log_normal4                           生成4个服从对数正态分布的float

curand_log_normal_double                生成服从对数正态分布的double

curand_log_normal2_double              生成2个服从对数正态分布的double

curand_mtgp32_single                    生成mtgp32算法中服从均匀分布的float

curand_mtgp32_single_specific         生成mtgp32算法中服从特殊泊松分布的float

curand_mtgp32_specific                    生成mtgp32算法中的32bits的int

如要生成一个int型的随机数,采用XORWOW算法:curand(curandStateXORWOW_t* state)

以上是个人理解,如有错误的地方,忘批评指正

urand_mtgp32_single 生成mtgp32算法中服从均匀分布的floa

curand_log_normal2 生成2个服从对数正态分布的float_log_normal 生成服从对数正态分布的floatcurand_log_normal 生成服从对数正态分布的floatcu

curand_log_normal 生成服从对数正态分布的floa

curand_log_normal 生成服从对数正态分布的floacurand_log_normal 生成服从对数正态分布的floacurand_log_normal 生成服从对数正态分布的f

CUDA随机数生成库curand——deviceAPI的更多相关文章

  1. CUDA数学库

    CUDA数学库 高性能数学例程 CUDA数学库是经过行业验证的,高度准确的标准数学函数的集合.只需在源代码中添加" #include math.h",即可用于任何CUDA C或CU ...

  2. cuda npp库旋转图片

    #include <stdio.h> #include <stdlib.h> #include <string.h> #include <assert.h&g ...

  3. NVIDIA GPU上的随机数生成

    NVIDIA GPU上的随机数生成 NVIDIA CUDA随机数生成库(cuRAND)提供高性能的GPU加速的随机数生成(RNG).cuRAND库使用NVIDIA GPU中提供的数百个处理器内核,将质 ...

  4. ubuntu16.04 Detectron目标检测库配置(包含GPU驱动,Cuda,Caffee2等配置梳理)

    Detectron概述 Detectron是Facebook FAIR开源了的一个目标检测(Object Detection)平台. 用一幅图简单说明下Object Detection.如Mask R ...

  5. CUDA基础介绍

    一.GPU简介 1985年8月20日ATi公司成立,同年10月ATi使用ASIC技术开发出了第一款图形芯片和图形卡,1992年4月ATi发布了Mach32图形卡集成了图形加速功能,1998年4月ATi ...

  6. 第一篇:CUDA 6.0 安装及配置( WIN7 64位 / 英伟达G卡 / VS2010 )

    前言 本文讲解如何在VS 2010开发平台中搭建CUDA开发环境. 当前配置: 系统:WIN7 64位 开发平台:VS 2010 显卡:英伟达G卡 CUDA版本:6.0 若配置不同,请谨慎参考本文. ...

  7. ubuntu16.04+caffe+GPU+cuda+cudnn安装教程

    步骤简述: 1.安装GPU驱动(系统适配,不采取手动安装的方式) 2.安装依赖(cuda依赖库,caffe依赖) 3.安装cuda 4.安装cudnn(只是复制文件加链接,不需要编译安装的过程) 5. ...

  8. [翻译]CURAND Libaray--Host API--(2)

    Translated by xingoo 如果有错误请联系:xinghl90@gmail.com 2.3 返回值 所有的CURAND host端的函数返回值都是curandStatus_t.如果调用没 ...

  9. cuda在ubuntu的安装使用分享

    前言 之前给大家分享过opencv在jetson nano 2gb和ubuntu设备中使用并且展示了一些人脸识别等的小demo.但是对于图像处理,使用gpu加速是很常见 .(以下概念介绍内容来自百科和 ...

随机推荐

  1. 只为粗暴看一下ES6的字符串模板的性能

    网上查找"ES6 字符串模板 +性能"5分钟无果遂写了一个暴力测试. 测试对象: +=方式,字符串累加计算方式 +s1+s2...+sn方式,即传统连加拼接字符串方式 s.push ...

  2. firefox浏览器相关的2个坑

    今天遇到一个bug,找回密码的功能在google浏览器正常,在firefox浏览器不正常.在排查该bug的过程中遇到2个坑.先总结一下: 1.firefox浏览器无法debug,“脚本”面板提示:本页 ...

  3. 【java设计模式】之 模板方法(Template Method)模式

    1. 模板方法的一个实例 这一节主要来学习一下设计模式中的模板方法模式.我们先来看一个例子:假如现在老板让你做一个汽车的模型,要求只要完成基本功能即可,不考虑扩展性,那你会怎么做呢?我们首先会根据经验 ...

  4. salesforce 零基础学习(六十四)页面初始化时实现DML操作

    有的时候我们往往会遇到此种类似的需求:用户在访问某个详细的记录时,需要记录一下什么时候哪个用户访问过此页面,也就是说进入此页面时,需要插入一条记录到表中,表有用户信息,record id,sObjec ...

  5. HTML中的a标签实现点击下载

    通常在咱们写项目的时候会遇到上传下载什么的,在上传完文件后会把文件的路径保存到数据库里以便下载,如果想不通过后台直接下载的话,可以把文件路径给a标签的属性href: <a href=" ...

  6. Dockerfile注意事项

    准则 尽量将Dockerfile放在空目录中,如果目录中必须有其他文件,则使用.dockerignore文件. 避免安装不必须的包. 每个容器应该只关注一个功能点. 最小化镜像的层数. 多行参数时应该 ...

  7. BZOJ 1103: [POI2007]大都市meg(dfs序,树状数组)

    本来还想链剖的,结果才发现能直接树状数组的= = 记录遍历到达点与退出点的时间,然后一开始每个到达时间+1,退出时间-1,置为公路就-1,+1,询问直接点1到该点到达时间求和就行了- - CODE: ...

  8. javah的使用

    2.我们要开始写javah的命令,以便生成对应的C语言头文件 D:\我的文档\workspace\PrepareForExam\src>javah -classpath D:\我的文档\work ...

  9. WP8.1开发中对于XAML中一些语言的学习(1);

    以前在学习WP开发的时候,看到视频中说到程序在创建之初,MainPaige.xaml页面上有一些代码: <Page x:Class="草案.MainPage" xmlns=& ...

  10. 浅谈Jasmine的安装和拆卸

    单元测试中,我们通常需要在执行测试代码前准备一些测试数据,建立测试场景,这些为了测试成功而所做的准备工作称为Test Fixture.而测试完毕后也需要释放运行测试所需的资源.这些铺垫工作占据的代码可 ...