Translated by xingoo

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

2.3 返回值

所有的CURAND host端的函数返回值都是curandStatus_t.如果调用没有错误,则返回成功,即返回值为CURAND_STATUS_SUCCESS.如果发生了错误,返回值会依据错误的不同而不同。因为cuda允许内核函数异步的调用cpu端的代码,因此返回的错误,有可能是在调用函数库时发生的,而非CURAND内核函数,此时,返回值是CURAND_STATUS_PREEXISTING.

2.4 触发函数

curandStatus_t curandGenerate(curandGenerator_t generator, unsigned int *outputPtr, size_t num)

curandGenerate() 函数用来生成伪随机或者真随机数序列。包括 XORWOW、MRG32k3a,MTGP32,and SOBOL32,每个元素都是32位unsigned int型的每位都是随机产生的。对于SOBOL64触发器来说,产生的是每一位随机产生的64位的unsigned long long型随机数。

curandStatus_t curandGenerateUniform(curandGenerator_t generator,  float *outputPtr, size_t num)

curandGenerateUniform() 函数用来产生0.0-1.0间的服从均匀分布(uniformly distributed)的浮点型随机数,其中0不包含0.0,包含1.0。

curandStatus_t curandGenerateNormal(curandGenerator_t generator, float *outputPtr, size_t n, float mean, float stddev)

curandGenerateNormal()函数通过指定的方法和输出目标来产生服从正态分布(normally distributed)的浮点型随机数。

curandStatus_t curandGenerateLogNormal(curandGenerator_t generator, float *outputPtr, size_t n, float mean, float stddev)

curandGenerateLogNormal()函数通过指定的方法和输出目标产生服从对数正态分布(log-normaly distributed)的浮点数。

curandStatus_t curandGeneratePoisson(curandGenerator_t generator, unsigned int *outputPtr, size_t n, double lambda)

curandGeneratePoision()函数通过指定的lamda产生基于泊松分布(possion distributed)的随机数。

curandStatus_tcurandGenerateUniformDouble(curandGenerator_t generator, double *outputPtr, size_t num)

curandGenerateUniformDouble()函数产生双精度的均匀分布的随机数。

curandStatus_tcurandGenerateNormalDouble(curandGenerator_t generator, double *outputPtr, size_t n, double mean, double stddev)

curandGenerateNormalDouble()触发器通过指定的方法和标准输出对象产生基于正态分布的双精度随机数。双精度的随机数只能在计算能力在1.3以上或者host端产生。

curandStatus_t curandGenerateLogNormalDouble(curandGenerator_t generator,double *outputPtr, size_t n, double mean, double stddev)

curandGernerateLogNormalDouble()通过指定的方法和输出对象产生基于正态分布的对数正态分布双精度随机数。

只有多维度的触发器才能产生真随机数。(大概是这个意思,For quasirandom generation,the number of results returned must be a multiple of the dimension of the generator)

生成函数能够被同一个触发器多次调用,来产生连续的结果块。对于伪随机数触发器,多次调用size大小的随机数,相当于一次调用产生n*size大小的随机数。对于真随机数触发器,由于内存的空间排序问题,多次短的调用,与一次长调用产生的结果并不相同;然而,产生的n维动态数组确实相同的。

双精度的随机数只能在计算能力1.3以上的设备或是host端产生。

2.5 Host API Example

/*

 * This program uses the host CURAND API to generate 100 

 * pseudorandom floats.

 */

#include <stdio.h>

#include <stdlib.h>

#include <cuda.h>

#include <curand.h>

#define CUDA_CALL(x) do { if((x)!=cudaSuccess) { \

    printf("Error at %s:%d\n",__FILE__,__LINE__);\

    return EXIT_FAILURE;}} while()

#define CURAND_CALL(x) do { if((x)!=CURAND_STATUS_SUCCESS) { \

    printf("Error at %s:%d\n",__FILE__,__LINE__);\

    return EXIT_FAILURE;}} while()

int main(int argc, char *argv[])

{

    size_t n = ;

    size_t i;

    curandGenerator_t gen;

float *devData, *hostData;

    /* Allocate n floats on host */

    hostData = (float *)calloc(n, sizeof(float));

    /* Allocate n floats on device */

    CUDA_CALL(cudaMalloc((void **)&devData, n*sizeof(float)));

    /* Create pseudo-random number generator */

    CURAND_CALL(curandCreateGenerator(&gen, 

                CURAND_RNG_PSEUDO_DEFAULT));

    /* Set seed */

    CURAND_CALL(curandSetPseudoRandomGeneratorSeed(gen, 

                1234ULL));

    /* Generate n floats on device */

    CURAND_CALL(curandGenerateUniform(gen, devData, n));

    /* Copy device memory to host */

    CUDA_CALL(cudaMemcpy(hostData, devData, n * sizeof(float),

        cudaMemcpyDeviceToHost));

    /* Show result */

    for(i = ; i < n; i++) {

        printf("%1.4f ", hostData[i]);

    }

    printf("\n");

    /* Cleanup */

    CURAND_CALL(curandDestroyGenerator(gen));

    CUDA_CALL(cudaFree(devData));

    free(hostData);    

    return EXIT_SUCCESS;

}

通常通过CURAND库产生的随机数规模越大,产生的性能越好。对于多次调用产生小规模的随机数来说,尽可能少的调用随机函数库而产生大量的随机数来使用,更有效率。比如一次产生n*size大小规模的随机数,然后分n次使用,要比n次调用,每次产生size高效。XORWOW是默认的伪随机数触发器,通过默认的排序,首次调用可能要花费一些时间来启动,后来的调用就不需要这步了。为了避免启动时间,可以使用CURAND_ORDERING_PSEUDO_SEEDED排序。

MTGP32 mersenne Twister算法与线程和块数目紧密联系。MTGP32的产生结果通常是一个通过特定的参数集产生的指定顺序的256个大小的样例,每64个块使用不同的参数集并且每256个线程产生整体中的一个样例。因此使用MTGP32产生16384个样品是最高效的。(这一块有待研究)。

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

  1. 翻译Android USB HOST API

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

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

    原文来自:cuda curand toolkit document Translated by xingoo 如果有错误请联系:xinghl90@gmail.com 2Host API简述 使用hos ...

  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. java代码流类

    总结:读取到的是字节型转换成字符串. package com.c2; import java.io.*; public class tkrp { public static void main(Str ...

  2. mybatis association表关联与rowbounds共同使用时的异常及其解决方案

    按照mybatis手册中所说的,association有两种实现方式,嵌套查询和嵌套结果映射.如手册中所述,select方式会带来N+1次查询的问题,考虑到效率问题的话建议使用嵌套结果映射.但是在结合 ...

  3. 分析诊断工具之一:MYSQL性能查看(多指标)

    网上有很多的文章教怎么配置MySQL服务器,但考虑到服务器硬件配置的不同,具体应用的差别,那些文章的做法只能作为初步设置参考,我们需要根据自己的情况进行配置优化,好的做法是MySQL服务器稳定运行了一 ...

  4. Git学习笔记(三)远程库(GitHub)协同开发,fork和忽略特殊文件

    远程库 远程库,通俗的讲就是不再本地的git仓库!他的工作方式和我们本地的一样,但是要使用他就需要先建立连接! 远程库有两种,一个是自己搭建的git服务器:另一种就是使用GitHub,这个网站就是提供 ...

  5. leetcode423

    public class Solution { public string OriginalDigits(string s) { ]; ; i < s.Length; i++) { char c ...

  6. xftp的简单使用

    1.下载并安装Xftp工具.打开Xftp工具,点击“新建”. 2.在“新建会话属性”中选择“名称”为主机命名,在“主机”栏输入主机IP,“协议”和“端口号”使用sftp和22,在“用户名”和“密码“栏 ...

  7. ffmpeg添加水印的方法举例 (砖)

    网上大部分关于ffmpeg加视频水印的方法还是使用vhook,在现在的ffmpeg中已经不推荐使用,但是也能编译,也能使用,至于效果,一会再说.现在的ffmpeg推荐使用的是libavfilter,但 ...

  8. js面试题知识点全解(一原型和原型链)

    1.如何准确判断一个变量是数组类型2.写一个原型链继承的例子3.描述new一个对象的过程4.zepto(或其他框架)源码中如何使用原型链知识点:1.构造函数2.构造函数-扩展3.原型规则和示例4.原型 ...

  9. oracle行转列练习

    ----------------------第一题--------------------------- create table STUDENT_SCORE ( name ), subject ), ...

  10. php入门学习

    尤其不认可W3school之类的东西,不够深度,理解不深,比起这个更建议看官方文档,中文不清楚,看英文的. 入门视频:入门视频推荐:哈佛大学公开课:构建动态网站Beginner PHP and MyS ...