原文来自:cuda curand toolkit document

Translated by xingoo

如果有错误请联系:xinghl90@gmail.com

2Host API简述

使用host api,用户需要在头文件的部分包含 curand.h,并且添加CURAND的动态链接库,即在LINKER的INPUT里面添加”curand.lib;”。这个文档是基于CUDA runtime的,所以用户的代码也应该是在runtime时调用的。而driver API是不支持CURAND的。

触发器生成随机数,CURAND同过内部的封装产生伪随机数列或者真随机数列。具体的步骤如下:

1 使用函数curandCreateGenerator创建一个新的目标类型(参考 触发器类型)触发器

2 设置触发器的选项(参考 触发器选项),比如,使用curandSetPseudoRandomGeneratorSeed() 来设置种子。

3 使用cudaMalloc()申请设备上的存储空间

4 通过curandGenerate()或者其他的生成函数 生成随机数

5 使用生成结果

6 如果希望生成更多的随机数,可以多次使用curandGenerate().

7 通过curandDestroyGenertator(),释放地址空间

如果希望在cpu的host端生成随机数,那么第一步应该调用curandCreateGeneratorHost(),;在第三步,要申请主机的一段地址空间来接收生成结果。其他步骤,在host端还是device端的操作都是相同的。

同一时间段创建几个触发器是可以的,每个触发器的封装都独立声明。每个触发器自己确定一组生成序列。如果每次运行的时候,设置相同的参数,生成随机序列也都是相同的。在device端生成的序列与在host端生成的也是相同的。

注意步骤4里面,curandGenerate()调用一段内核函数,并且异步返回。所以,如果你在不同的流里面运行了另一个内核函数,而这个内核函数又要使用curandGenerate()的结果,那么就必须调用cudaThreadSynchronized() 来实现同步,以确保生成随机序列的内核函数在被调用前结束执行。(也可以通过下面这种方法解决:use the stream management/event management routines 实在不知道这个方法怎么翻译)

通过一个host端的指针来调用在device上运行的触发器,以及通过一个device端的指针来调用运行在host端的触发器,这种情况都属于未定义。

2.1触发器类型Generator Types

随机数触发器通过curandCreateGenerator()来传递类型创建。在CURAND中有7种随机数触发器类型,我们把他们分为两类。

2.1.1 伪随机数触发器

CURAND_RNG_PSEUDO_XORWOW,(基于异或移位算法XORWOW)

CURAND_RNG_PSEUDO_MRG32K3A,(基于Combined Multiplie Recursive)

CURAND_RNG_PSEUDO_MTGP32(基于梅森旋转法Mersenne Twister)

2.1.2 真随机数触发器

这4种触发器都是基于SOBOL序列的变种的真随机数序列触发器

CURAND_RNG_QUASI_SOBOL32(是一种32位序列的SOBOL触发器)

CURAND_RNG_QUASI_SCRAMBLED_SOBOL32(srambled不知道怎么翻译才好)

CURAND_RNG_QUASI_SOBOL64(是一种64位序列的SOBOL触发器)

CURAND_RNG_QUASI_SCRAMBLED_SOBOL64

2.2触发器选项 Generator Options

创建时,随机数触发器就能通过基本选项---seed种子,offset消耗和order顺序来定义。

2.2.1 seed 种子

种子是一个64位的整型数,用来初始化伪随机触发器的产生。相同的种子,能够产生相同的序列。

2.2.2 Offset消耗/补偿

这个选项用来跳过序列开始的一段随机数。如果offset=100,那么第一个随机数产生的时候,会从原来的随机数序列的第100个开始。这让多次运行同一段程序可以继续使用相同序列产生的随机数,而不会重叠。这个跳过的功能不支持CURAND_RNG_PSEUDO_MTGP32触发器。

2.2.4 Order顺序

这个选项用来选择在全局内存上生成的随机数如何排序。

有三种伪随机序列顺序可以选择:

CURAND_ORDERING_PSEUDO_DEFAULT(默认的)

CURAND_ORDERING_PSEUDO_BEST

CURAND_ORDERING_PSEUDO_SEEDED.

有一种真随机序列顺序可以选择:

CURAND_ORDERING_DEFAULT.

目前,CURAND_ORDERING_PSEUDO_DEFAULT 和 CURAND_ORDERING_PSEUDO_BEST对于所有的伪随机触发器产生的结果都是相同的。然而,未来的版本,CURAND可能会调整CURAND_ORDERING_PSEUDO_BEST,使之无论是性能还是质量上都得以改善。而CURAND_ORDERING_PSEUDO_DEFAULT对于任何的CURAND版本都会保持相同的产生结果。在目前的版本中,只有XORWOW触发器拥有多种产生顺序。

关于产生顺序,每种触发器的做法如下:

XORWOW伪随机触发器:

CURAND_ORDERING_PSEUDO_BEST

  目前版本同CURAND_ORDERING_PSEUDO_DEFAULT的输出顺序是相同的

CURAND_ORDERING_PSEUDO_DEFAULT

  当offset=n时,随机序列在全局内存中从(n mpd 4096)-2 67+[n/4096]开始

CURAND_ORDERING_PSEUDO_SEEDED

  当offset=n时,随机序列在全局内存中从n mod 4096开始。也就是说,每4096个线程使用不同的种子。这种种子的方式,虽然节省了运行时间,但对于某些种子的值,伪随机序列输出结果统计也显示出了一些不足。

MRG32K3A 伪随机触发器

CURAND_ORDERING_PSEUDO_BEST

  跟下面的DEFAULT一样

CURAND_ORDERING_PSEUDO_DEFAULT

  当offset=n时,公式为(n mod 4096) -276+[n/4096](注意这个触发器产生的跨度跟XORWOW产生的跨度是不一样的)

MTGP32 伪随机触发器

CURAND_ORDERING_PSEUDO_BEST

  同样跟DEFAULT的顺序相同

CURAND_ORDERING_PSEUDO_DEFAULT

  MTGP32触发器基于基本算法,通过设置不同参数,能够产生64种随机序列。使用S(p)来定义序列,p为参数。Offset=n时,公式为S([n/256]mod 64).也就是说,S(0)会有256个例子,然后是S(1)的256个,一直到S(63),一直重复。

Philox_4x32_10 伪随机触发器

CURAND_ORDERING_PSEUDO_BEST

  跟下面的DEFAULT一样

CURAND_ORDERING_PSEUDO_DEFAULT

  每个触发器的线程都会产生不同的随机序列。在host API中有8192种不同的序列。来自于一个序列的每四个值都依赖于下一个序列的四个值(Each four values from one sequence are followed by four values from next sequence)。

位的SOBOL以及快速SOBOL真随机触发器

CURAND_ORDERING_QUASI_DEFAULT

  当在d个dimensions上面生成n个结果,第1个dimesion由n/d个结果组成,第2个也由n/d个组成,一直到第d个dimension.触发器只能生成dimension的倍数大小的序列。这个dimension的参数d使用curandSetQuasiRandomGeneratorDimensions(),并且默认为1.

[翻译]CURAND Libaray--Host API--(1)的更多相关文章

  1. 翻译Android USB HOST API

    翻译Android USB HOST API 源代码地址:http://developer.android.com/guide/topics/connectivity/usb/host.html 译者 ...

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

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

  3. couldn't resolve host api.weixin.qq.com

    1.代理服务器突然出现 couldn't resolve host api.weixin.qq.com 不知原因 2.重启nginx无效-----代码肯定没有动过(之前出现过,过了一天恢复) 3.防火 ...

  4. 【翻译】Flink Table Api & SQL — 内置函数

    本文翻译自官网:Built-In Functions  https://ci.apache.org/projects/flink/flink-docs-release-1.9/dev/table/fu ...

  5. Android开启OTG功能/USB Host API功能

    Android USB 模式简介 设备模式 当计算机或其他USB主机需要连接安卓设备时,此时安卓设备是作为"USB设备"角色的,在计算机上显示为 USB 外设.现在的安卓设备已经被 ...

  6. [翻译]ASP.NET Web API 2 中的全局错误处理

    目录 已存在的选项 解决方案预览 设计原则 什么时候去用 方案详情 示例 附录: 基类详情 原文链接 Global Error Handling in ASP.NET Web API 2 由于翻译水平 ...

  7. 【翻译】Flink Table Api & SQL —— 连接到外部系统

    本文翻译自官网:Connect to External Systems  https://ci.apache.org/projects/flink/flink-docs-release-1.9/dev ...

  8. 【Android Api 翻译3】android api 完整翻译之Application Fundamentals (学习android必须知道的)

    Android应用程序是用Java编程语言编写的.Android SDK工具把应用程序的代码.数据和资源文件一起编译到一个Android程序包中(这个程序包是以.apk为后缀的归档文件),一个Andr ...

  9. Python 批量翻译 使用有道api;

    妹子是做翻译相关的,遇到个问题,要求得到句子中的所有单词的 音标; 有道翻译只能对单个单词翻译音标,不能对多个单词或者句子段落翻译音标; 手工一个一个翻的话那就要累死人了.....于是就让我写个翻译音 ...

随机推荐

  1. JVM插码之四:Java动态代理机制的对比(JDK 和CGLIB,Javassist,ASM)

    一.class文件简介及加载 Java编译器编译好Java文件之后,产生.class 文件在磁盘中.这种class文件是二进制文件,内容是只有JVM虚拟机能够识别的机器码.JVM虚拟机读取字节码文件, ...

  2. PAT 垃圾箱分布(30分)dijstra

    垃圾箱分布 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 大家倒垃圾的时候,都希望垃圾箱距离自己比较近,但是谁都不愿意守着垃圾 ...

  3. MySQL mysqldump与innobackupex 组合备份

    此脚本,在01点进行一次逻辑全备份,03点进行一次物理全备份,中午12点进行一次增量物理备份 #! /bin/bash #05 01,03,12 * * * mysql /data/mysqldata ...

  4. 2015.3.12 C#运用正则表达式点滴

    Regex reg = new Regex(@"\w{1,}@\w{1,}\.(com)?(net)?"); //匹配(1个或多个)(字母或数字或下滑线)@ (1个或多个)(字母或 ...

  5. 2015.3.3 VC++6制作MFC dll并在其中使用对话框、引入类的操作

    上例建立的dll为非MFC的,不能使用MFC框架,如CString.对话框等类型,使用起来有一定限制.可以建立MFC的Dll来改进.建立MFC Dll的方法: 1.在VC6中新建工程时选择:MFC A ...

  6. Shell编程进阶 1.6 if判断的几种用法

    针对文件和目录的逻辑判断 touch .txt .txt ]; then echo ok;fi -f 判断1.txt是否是文件且是否存在,成立输出ok if [-d /tmp/ ]; then ech ...

  7. C++深度解析教程学习笔记(2)C++中的引用

    1.C++中的引用 (1)变量名的回顾 ①变量是一段实际连续存储空间的别名,程序中通过变量来申请并命名存储空间 ②通过变量的名字可以使用存储空间.(变量的名字就是变量的值,&变量名是取地址操作 ...

  8. EF CODEFIRST WITH ORACLE

    摸索了半天,运行通过了,但是还是有一点坑的,对于初次使用的人来说,可能会遇到几个问题 首先安装两个dll 如果你已经下载好了dll Oracle.ManagedDataAccess.dll Oracl ...

  9. 玩转Jquery

    一 jquery简介 1 jquery是什么 jQuery由美国人John Resig创建,至今已吸引了来自世界各地的众多 javascript高手加入其team. jQuery是继prototype ...

  10. HDU 4348(主席树 标记永久化)

    题面一看就是裸的数据结构题,而且一看就知道是主席树... 一共四种操作:1:把区间[l, r]的数都加上d,并且更新时间.2:查询当前时间的区间和.3:查询历史时间的区间和.4:时光倒流到某个时间. ...