适用于CUDA GPU的Numba 随机数生成

随机数生成

Numba提供了可以在GPU上执行的随机数生成算法。由于NVIDIA如何实现cuRAND的技术问题,Numba的GPU随机数生成器并非基于cuRAND。相反,Numba的GPU RNG是xoroshiro128 +算法的实现。xoroshiro128 +算法的周期为2**128 - 1,比cuRAND中默认使用的XORWOW算法的周期短,但是xoroshiro128 +算法仍然通过了随机数发生器质量的BigCrush测试。

在GPU上使用任何RNG时,重要的是要确保每个线程都有其自己的RNG状态,并且它们已初始化为产生不重叠的序列。numba.cuda.random模块提供了执行此操作的主机功能,以及提供统一或正态分布的随机数的CUDA设备功能。

注意

Numba (like cuRAND) uses the Box-Muller transform <https://en.wikipedia.org/wiki/Box%E2%80%93Muller_transform>从统一生成器生成正态分布的随机数。但是,Box-Muller生成随机数对,当前实现只返回其中之一。结果,生成正态分布的值是均匀分布的值的速度的一半。

numba.cuda.random.create_xoroshiro128p_states(n, seed, subsequence_start=0, stream=0)

返回为n个随机数生成器初始化的新设备数组。

这将初始化RNG状态,以便数组中的每个状态与主序列中彼此分开2 ** 64步的子序列相对应。因此,只要没有CUDA线程请求超过2 ** 64个随机数,就可以保证此函数产生的所有RNG状态都是独立的。

subsequence_start参数可用于将第一个RNG状态提前2 ** 64步的倍数。

参数:

  • nint)–要创建的RNG状态数
  • seeduint64)–生成器列表的起始种子
  • subsequence_startuint64)–
  • StreamCUDA流)–在其上运行初始化内核的流

numba.cuda.random.init_xoroshiro128p_states(states, seed, subsequence_start=0, stream=0)

在GPU上为并行生成器初始化RNG状态。

这将初始化RNG状态,以便数组中的每个状态与主序列中彼此分开2 ** 64步的子序列相对应。因此,只要没有CUDA线程请求超过2 ** 64个随机数,就可以保证此函数产生的所有RNG状态都是独立的。

subsequence_start参数可用于将第一个RNG状态提前2 ** 64步的倍数。

参数:

  • states (1D DeviceNDArray, dtype=xoroshiro128p_dtype)– RNG状态数组
  • seeduint64)–生成器列表的起始种子

numba.cuda.random.xoroshiro128p_uniform_float32

返回范围为[0.0,1.0)的float32并前进states[index]

参数:

  • states (1D DeviceNDArray, dtype=xoroshiro128p_dtype)– RNG状态数组
  • indexint64)–要更新的状态的偏移量

返回类型:

float32

numba.cuda.random.xoroshiro128p_uniform_float64

返回范围为[0.0,1.0)的float64并前进states[index]

参数:

  • 状态states (1D array, dtype=xoroshiro128p_dtype)– RNG状态数组
  • indexint64)–要更新的状态的偏移量

返回类型:

float64

numba.cuda.random.xoroshiro128p_normal_float32

返回正态分布的float32并前进states[index]

使用Box-Muller变换从平均值= 0和sigma = 1的高斯中得出返回值。这使RNG序列前进了两个步骤。

参数:

  • states (1D array, dtype=xoroshiro128p_dtype)– RNG状态数组
  • indexint64)–要更新的状态的偏移量

返回类型:

float32

numba.cuda.random.xoroshiro128p_normal_float64

返回正态分布的float32并前进states[index]

使用Box-Muller变换从平均值= 0和sigma = 1的高斯中得出返回值。这使RNG序列前进了两个步骤。

参数:

  • 状态states (1D array, dtype=xoroshiro128p_dtype)– RNG状态数组
  • indexint64)–要更新的状态的偏移量

返回类型:

float64

这是使用随机数生成器的示例程序:

from __future__ import print_function, absolute_import

from numba import cuda

from numba.cuda.random import create_xoroshiro128p_states, xoroshiro128p_uniform_float32

import numpy as np

@cuda.jit

def compute_pi(rng_states, iterations, out):

"""Find the maximum value in values and store in result[0]"""

thread_id = cuda.grid(1)

# Compute pi by drawing random (x, y) points and finding what

# fraction lie inside a unit circle

inside = 0

for i in range(iterations):

x = xoroshiro128p_uniform_float32(rng_states, thread_id)

y = xoroshiro128p_uniform_float32(rng_states, thread_id)

if x**2 + y**2 <= 1.0:

inside += 1

out[thread_id] = 4.0 * inside / iterations

threads_per_block = 64

blocks = 24

rng_states = create_xoroshiro128p_states(threads_per_block * blocks, seed=1)

out = np.zeros(threads_per_block * blocks, dtype=np.float32)

compute_pi[blocks, threads_per_block](rng_states, 10000, out)

print('pi:', out.mean())

适用于CUDA GPU的Numba 随机数生成的更多相关文章

  1. 适用于CUDA GPU的Numba例子

    适用于CUDA GPU的Numba例子 矩阵乘法 这是使用CUDA内核的矩阵乘法的简单实现: @cuda.jit def matmul(A, B, C): """Perf ...

  2. 适用于AMD ROC GPU的Numba概述

    适用于AMD ROC GPU的Numba概述 Numba通过按照HSA执行模型将Python代码的受限子集直接编译到HSA内核和设备功能中,从而支持AMD ROC GPU编程.用Numba编写的内核似 ...

  3. NVIDIA GPU上的随机数生成

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

  4. Gradient Boosting, Decision Trees and XGBoost with CUDA ——GPU加速5-6倍

    xgboost的可以参考:https://xgboost.readthedocs.io/en/latest/gpu/index.html 整体看加速5-6倍的样子. Gradient Boosting ...

  5. CUDA ---- GPU架构(Fermi、Kepler)

    GPU架构 SM(Streaming Multiprocessors)是GPU架构中非常重要的部分,GPU硬件的并行性就是由SM决定的. 以Fermi架构为例,其包含以下主要组成部分: CUDA co ...

  6. 奉献pytorch 搭建 CNN 卷积神经网络训练图像识别的模型,配合numpy 和matplotlib 一起使用调用 cuda GPU进行加速训练

    1.Torch构建简单的模型 # coding:utf-8 import torch class Net(torch.nn.Module): def __init__(self,img_rgb=3,i ...

  7. CUDA && GPU中dim3介绍

  8. 布客&#183;ApacheCN 翻译/校对/笔记整理活动进度公告 2020.1

    注意 请贡献者查看参与方式,然后直接在 ISSUE 中认领. 翻译/校对三个文档就可以申请当负责人,我们会把你拉进合伙人群.翻译/校对五个文档的贡献者,可以申请实习证明. 请私聊片刻(52981514 ...

  9. 真实机下 ubuntu 18.04 安装GPU +CUDA+cuDNN 以及其版本选择(亲测非常实用)【转】

    本文转载自:https://blog.csdn.net/u010801439/article/details/80483036 ubuntu 18.04 安装GPU +CUDA+cuDNN : 目前, ...

随机推荐

  1. 移动端小总结(1)---meta、input和单行多行文字溢出省略号

    一.常用META 1. 添加到主屏后的标题(IOS) 1 <meta name="apple-mobile-web-app-title" content="标题&q ...

  2. drozer源码学习二:info+scanner

    Information: datetime:    输出android中当前日期:time. setToNow() deviceinfo:   输出设备信息 deviceinfo做了三件事: 1.  ...

  3. CVE-2013-0077:Microsoft DirectShow quartz.dll m2p 文件堆溢出漏洞简单分析

    0x01 前言 2012 年 10 月 5 日,exploit-db 漏洞公布站点上发布了 QQplayer.exe 3.7.892 m2p quartz.dll Heap Pointer OverW ...

  4. 推荐算法-聚类-DBSCAN

    DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一个比较有代表性的基于密度的聚类算法,类似于均值转移聚类算法,但 ...

  5. 冒泡排序——Python实现

    冒泡排序Python实现 # -*- coding: utf-8 -*- # @Time : 2019/10/28 19:41 # @Author : yuzhou_1shu # @Email : y ...

  6. 数据表格 layui.table

    layui官网-表单 自动渲染 方法渲染 table.render,cols中的field是后台传递的data map.put("data",stuService.selectSt ...

  7. svg web拓扑更新了,支持动态添加svg组件

    版本1.0请点此 预览地址 https://svg.yaolunmao.top 如何使用 # 克隆项目 git clone https://github.com/yaolunmao/vue-webto ...

  8. ruby基础(一)

    Ruby基础 1.对象.变量和常量 1.1 对象 在Ruby中表示数据的最基本单位是对象,任何数据都是对象,使用类来表示对象的种类. 一个某个类的对象称作对象的实例. 对象 类 eg 数值 Numer ...

  9. xrandr 直接输这个能显示可用的分辨和当前的分辨率 xrandr -s 1920x1200就设置成指定的分辨率

    利用 xrandr 命令修改屏幕分辨率 时间  2016-10-29 原文   http://blog.csdn.net/mao0514/article/details/52965700   问题背景 ...

  10. Shell脚本 /dev/null 2>&1详解

    Shell脚本---- /dev/null 2>&1详解   1.可以将/dev/null看作"黑洞". 它非常等价于一个只写文件. 所有写入它的内容都会永远丢失. ...