Main Content

本页采用了机器翻译。点击此处可查看英文原文。

parallel.gpu.RandStream

GPU 上的随机数流

说明

使用 parallel.gpu.RandStream 控制全局 GPU 随机数流,并在 GPU 上创建多个独立的流。当您在 GPU 上生成随机数时,这些数字是从 GPU 随机数流中提取的。此流与 CPU 上的客户端 MATLAB® 会话的随机流不同。

要在 GPU 上创建随机数,请使用随机数生成器函数 randrandirandn 以及 gpuArray。默认情况下,这些函数从全局 GPU 随机数流中提取数字。要使用不同的流,请按照 对象函数 中描述的语法进行操作。如果使用 GPU 随机数流,结果将以 gpuArray 的形式返回。

创建对象

使用以下语法创建单个 parallel.gpu.RandStream 对象。如果想要同时创建多个独立流,请使用 parallel.gpu.RandStream.create 函数。

描述

示例

s = parallel.gpu.RandStream(gentype) 创建一个使用 'gentype' 指定的均匀伪随机数生成器算法的随机数流。

示例

s = parallel.gpu.RandStream(gentype,Name,Value) 还指定一个或多个可选的 Name,Value 对来控制流的属性。

输入参量

全部展开

随机数生成器算法,指定为 GPU 上支持的以下三种随机数生成器算法之一。

关键词生成器多流和子流支持高精度近似周期
"Threefry""Threefry4x64_20"执行 20 轮的 Threefry 4x64 生成器2514(2256 个长度为 2258 的流)
"Philox""Philox4x32_10"执行 10 轮的 Philox 4x32 生成器2193(264 条长度为 2129 的流)
"CombRecursive""mrg32k3a"组合多重递归生成器2191(263 条长度为 2127 的流)

有关在 GPU 和 CPU 上生成随机数的差异的更多信息,请参阅 GPU 上的随机数流

此参量设置 Type 属性。

属性

全部展开

此 属性 为只读。

指定为 'Threefry4x64_20''Philox4x32_10''mrg32k3a' 的流使用的生成器算法。

创建流时使用 gentype 参量设置此属性。

数据类型: char

此 属性 为只读。

随机数种子,指定为由 'Seed' 和一个非负整数组成的逗号分隔的对,或者指定为字符串或字符向量 'shuffle'。种子指定了算法生成随机数的起点。当您想要可重现的结果时,请将 'Seed' 指定为整数。将 'Seed' 指定为 'shuffle' 会根据当前时间为生成器设定种子。

创建流时将此属性设置为名称-值对。

此 属性 为只读。

创建当前流的组中的流数,指定为正整数。使用函数 parallel.gpu.RandStream.create 一次创建多个流。

当前流的流索引,指定为正整数。当您使用函数 parallel.gpu.RandStream.create 一次创建多个流时,流索引会标识各个流。

随机数流的当前状态,指定为向量。内部状态决定随机数流 s 产生的随机数序列。该状态向量的大小取决于所选择的生成器。

使用 State 属性保存和恢复生成器的内部状态允许您重现一系列随机数。当您设置此属性时,您分配给 s.State 的值必须是先前从 s.State 读取的值。使用 reset 将流返回到可预测状态,而无需先前从 State 属性读取。

正态变换算法,指定为 'BoxMuller'Inversion'

正态变换算法指定使用 randn 生成正态分布的随机数时使用的算法。'Threefry'Philox' 生成器支持 'BoxMuller' 算法。'CombRecursive' 生成器支持 'Inversion' 算法。GPU 上不支持任何其他转换算法。

数据类型: char

此 属性 为只读。

对立值,指定为 false0。此属性指示 S 是否生成对立伪随机值,即从 1 中减去通常值以获得均匀值。

此属性始终为 0。该流不会产生对立的值。您不能修改此属性。

数据类型: logical

此 属性 为只读。

全精度生成,指定为 true1。此属性指示随机数流是否使用全精度生成值。使用两个随机数来确保双精度数的所有位都已设置。

此属性始终为 1。您不能修改此属性。

数据类型: logical

对象函数

parallel.gpu.RandStream.create在 GPU 上创建独立的随机数流
parallel.gpu.RandStream.listGPU 上的随机数生成器算法
parallel.gpu.RandStream.getGlobalStream当前全局 GPU 随机数流
parallel.gpu.RandStream.setGlobalStream设置 GPU 全局随机数流
reset (RandStream)重置随机数流

默认情况下,当您使用随机数生成函数(例如 rand)在 GPU 上创建随机数时,随机数是从 GPU 上的全局随机数流中提取的。要指定不同的流,请创建一个 parallel.gpu.RandStream 对象并将其作为第一个输入参量传递。例如,使用 Philox 生成器算法创建一个 4×1 的随机数向量。

s = parallel.gpu.RandStream('Philox');
r = rand(s,4,1);

这些函数接受 parallel.gpu.RandStream 对象并在 GPU 上生成随机数:

rand均匀分布的随机数

支持的语法,其中 sparallel.gpu.RandStream 对象:

X = rand(s)
X = rand(s,n)
X = rand(s,sz1,...,szN)
X = rand(s,sz)
X = rand(s,typename)
有关其他输入参量的详细信息,请参阅 randrandirandn

randi均匀分布的伪随机整数
randn正态分布的随机数
randperm整数的随机排列

支持的语法,其中 sparallel.gpu.RandStream 对象:

p = randperm(s,n)
p = randperm(s,n,k)
有关其他输入参量的详细信息,请参阅 randperm

示例

全部折叠

您可以更改 GPU 上的全局随机数流。首先,定义要设置为新全局流的随机数流。

newStr = parallel.gpu.RandStream('Philox')
newStr =

Philox4x32_10 random stream on the GPU
             Seed: 0
  NormalTransform: BoxMuller

接下来,将这个新流设置为全局流。

parallel.gpu.RandStream.setGlobalStream(newStr);

检查 newStr 是否为当前全局流。

newStr
newStr =

Philox4x32_10 random stream on the GPU (current global stream)
             Seed: 0
  NormalTransform: BoxMuller

在 GPU 上,函数 randrandirandn 现在使用 'Philox' 生成器算法从新的全局流中提取随机数。

如果您的应用程序需要在 GPU 和 CPU 上生成相同的随机数,则可以设置流以匹配。在 GPU 和 CPU 上创建匹配的流,并在每种情况下将它们设置为全局流。

stCPU = RandStream('Threefry','Seed',0,'NormalTransform','Inversion');
stGPU = parallel.gpu.RandStream('Threefry','Seed',0,'NormalTransform','Inversion');

只有 'Inversion' 正态变换算法在 GPU 和 CPU 上均可用。

将这些流分别设置为 CPU 和 GPU 上的全局流。

RandStream.setGlobalStream(stCPU);
parallel.gpu.RandStream.setGlobalStream(stGPU);

现在调用 randrandn 会在 GPU 和客户端 MATLAB 会话上产生相同的数字集。

rC = rand(1,8)
rG = rand(1,8, 'gpuArray')
rC =
    0.1726    0.9207    0.8108    0.7169    0.8697    0.7920    0.4159    0.6503

rG =
    0.1726    0.9207    0.8108    0.7169    0.8697    0.7920    0.4159    0.6503

rnC = randn(1,8)
rnG = randn(1,8, 'gpuArray')
rnC =
    -0.9438    1.4095    0.8807    0.5736    1.1250    0.8133   -0.2124    0.3862

rnG =
    -0.9438    1.4095    0.8807    0.5736    1.1250    0.8133   -0.2124    0.3862

扩展功能

版本历史记录

在 R2011b 中推出