适用于CUDA GPU的Numba 随机数生成
适用于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步的倍数。
|
参数: |
|
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步的倍数。
|
参数: |
|
numba.cuda.random.xoroshiro128p_uniform_float32
返回范围为[0.0,1.0)的float32并前进states[index]。
|
参数: |
|
|
返回类型: |
float32 |
numba.cuda.random.xoroshiro128p_uniform_float64
返回范围为[0.0,1.0)的float64并前进states[index]。
|
参数: |
|
|
返回类型: |
float64 |
numba.cuda.random.xoroshiro128p_normal_float32
返回正态分布的float32并前进states[index]。
使用Box-Muller变换从平均值= 0和sigma = 1的高斯中得出返回值。这使RNG序列前进了两个步骤。
|
参数: |
|
|
返回类型: |
float32 |
numba.cuda.random.xoroshiro128p_normal_float64
返回正态分布的float32并前进states[index]。
使用Box-Muller变换从平均值= 0和sigma = 1的高斯中得出返回值。这使RNG序列前进了两个步骤。
|
参数: |
|
|
返回类型: |
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 随机数生成的更多相关文章
- 适用于CUDA GPU的Numba例子
适用于CUDA GPU的Numba例子 矩阵乘法 这是使用CUDA内核的矩阵乘法的简单实现: @cuda.jit def matmul(A, B, C): """Perf ...
- 适用于AMD ROC GPU的Numba概述
适用于AMD ROC GPU的Numba概述 Numba通过按照HSA执行模型将Python代码的受限子集直接编译到HSA内核和设备功能中,从而支持AMD ROC GPU编程.用Numba编写的内核似 ...
- NVIDIA GPU上的随机数生成
NVIDIA GPU上的随机数生成 NVIDIA CUDA随机数生成库(cuRAND)提供高性能的GPU加速的随机数生成(RNG).cuRAND库使用NVIDIA GPU中提供的数百个处理器内核,将质 ...
- 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 ...
- CUDA ---- GPU架构(Fermi、Kepler)
GPU架构 SM(Streaming Multiprocessors)是GPU架构中非常重要的部分,GPU硬件的并行性就是由SM决定的. 以Fermi架构为例,其包含以下主要组成部分: CUDA co ...
- 奉献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 ...
- CUDA && GPU中dim3介绍
- 布客·ApacheCN 翻译/校对/笔记整理活动进度公告 2020.1
注意 请贡献者查看参与方式,然后直接在 ISSUE 中认领. 翻译/校对三个文档就可以申请当负责人,我们会把你拉进合伙人群.翻译/校对五个文档的贡献者,可以申请实习证明. 请私聊片刻(52981514 ...
- 真实机下 ubuntu 18.04 安装GPU +CUDA+cuDNN 以及其版本选择(亲测非常实用)【转】
本文转载自:https://blog.csdn.net/u010801439/article/details/80483036 ubuntu 18.04 安装GPU +CUDA+cuDNN : 目前, ...
随机推荐
- 【Springboot】FastJson与Jackson全局序列化方式的配置和相关工具类
springboot 版本: <parent> <groupId>org.springframework.boot</groupId> <artifactId ...
- python 实现最有对其
print("|","Ursula".ljust(20,""),"|") # 左对齐 print("|&quo ...
- QQ可以登录,网页无法访问
之前以为是网络的问题,但是,后来发现QQ却可以登录,这是第二次碰到这个情况,所以总结一下 一般我们电脑上都会安装一个杀毒软件,比如火绒等等.我电脑上用的联想自带的电脑管家 我们可以在工具箱中找到网络诊 ...
- opencv——图像遍历以及像素操作
摘要 我们在图像处理时经常会用到遍历图像像素点的方式,在OpenCV中一般有四种图像遍历的方式,在这里我们通过像素变换的点操作来实现对图像亮度和对比度的调整. 补充: 图像变换可以看成 像素变换--点 ...
- Zoho创始人斯瑞达.温布获评“年度最佳CEO”
近日,权威研究和咨询机构Constellation Research公布了一系列奖项,Zoho创始人斯瑞达.温布获评"年度最佳CEO"(The Best Enterprise CE ...
- slickgrid ( nsunleo-slickgrid ) 8 区域选择与复制粘贴
区域选择 区域选择是通过插件CellRangeSelector实现的,默认不支持跨冻结列进行选择,修正了选择,支持跨冻结列,代码如下,通过判断选择的起点和终点所落在的冻结范围进行计算,如从左往右进行复 ...
- [Java]数据分析--聚类
距离度量 需求:计算两点间的欧几里得距离.曼哈顿距离.切比雪夫距离.堪培拉距离 实现:利用commons.math3库相应函数 1 import org.apache.commons.math3.ml ...
- CentOS8.2集成的megaraid_sas版本不支持IBM X3850 X5内置RAID卡。需要更新https://docs.broadcom.com/docs/MR_LINUX_DRIVER_7.15-07.715.02.00-1-PUL.tgz
CentOS8.2集成的megaraid_sas版本不支持IBM X3850 X5内置RAID卡.需要更新https://docs.broadcom.com/docs/MR_LINUX_DRIVER_ ...
- MySQL配置HeartBeat实现心跳监控和浮动IP
1. 初始化环境配置 /sbin/chkconfig --add mysqld /sbin/chkconfig mysqld on ln -s /usr/local/mysql/bin/mysql / ...
- 《SystemVerilog验证-测试平台编写指南》学习 - 第2章 数据类型
<SystemVerilog验证-测试平台编写指南>学习 - 第2章 数据类型 2.1 内建数据类型 2.2 定宽数组 2.2.1 声明 2.2.2 常量数组 2.2.3 基本的数组操作 ...