适用于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. android调用号和libc

    调用号(以arm平台为例)在/bionic/libc/kernel/uapi/asm-arm/asm/unistd.h: /* WARNING: DO NOT EDIT, AUTO-GENERATED ...

  2. 音视频开发:为什么推荐使用Jetpack CameraX?

    我们的生活已经越来越离不开相机,从自拍到直播,扫码再到VR等等.相机的优劣自然就成为了厂商竞相追逐的赛场.对于app开发者来说,如何快速驱动相机,提供优秀的拍摄体验,优化相机的使用功耗,是一直以来追求 ...

  3. java之Collection

    java中的Collection可分为List.Set.Queue三种类型. 1.List. List会按照插入的顺序保存对象,较为常用的实现类有ArrayList,LinkedList和Vector ...

  4. 修改wordpress版权信息

    修改页脚版权信息位置:找到C:\wamp64\www\wordpress\wp-content\themes\travelify\library\structure\footer-extensions ...

  5. .NET Core 中依赖注入框架详解 Autofac

    本文将通过演示一个Console应用程序和一个ASP.NET Core Web应用程序来说明依赖注入框架Autofac是如何使用的 Autofac相比.NET Core原生的注入方式提供了强大的功能, ...

  6. 使用FileStream读写数据

    这节讲一下使用FileStream读写数据,这是一个比较基础的流. FileStream类只能处理原始字节,所以它可以处理任何类型的文件. 先看一下它的构造方法: FileStream fs = ne ...

  7. Vue.js源码解析-从scripts脚本看vue构建

    目录 1. scripts 脚本构建 1.1 dev 开发环境构建过程 1.1.1 配置文件代码 1.1.2 如何进行代码调试? 1.2 build 生产环境构建过程 1.2.1 scripts/bu ...

  8. 1.HTML入门

    1.1 初识HTML 1.1.1 概述 网络世界已经跟我们息息相关,当我们打开一个网站,首先映入眼帘的就是一个个华丽多彩的网页.这些网页,不仅呈现着基本的内容,还具备优雅的布局和丰富的动态效果,这一切 ...

  9. ip_conntrack or nf_conntrack : table full, dropping packet

    nf_conntrack: table full, dropping packet ip_conntrack or nf_conntrack : table full, dropping packet ...

  10. Zabbix agent端 配置

    Zabbix agent端 配置 agent端环境 zabbix-client:RHEL8 IP:192.168.121.11 一.安装 Zabbix 源 [root@zabbix-client ~] ...