主要内容

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

parallel.gpu.RandStream

GPU 上的随机数流

说明

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

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

创建对象

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

描述

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

示例

s = parallel.gpu.RandStream(gentype,Name=Value) 使用一个或多个名称-值参量来指定选项,此外还使用生成器算法参量。例如,要根据当前时间为随机数生成器提供种子,请将 Seed 设置为 "shuffle"

示例

输入参量

全部展开

随机数生成器算法,指定为 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 属性。

示例: s = parallel.gpu.RandStream("Philox")

名称-值参数

全部展开

将可选参量对指定为 Name1=Value1,...,NameN=ValueN,其中 Name 是参量名称,Value 是相应的值。名称-值参量必须出现在其他参量之后,但对的顺序并不重要。

示例: s = parallel.gpu.RandStream("Philox",Seed="shuffle")

随机数种子,指定为非负整数或 "shuffle"。种子指定了算法生成随机数的起点。当您想要可重现的结果时,请将 Seed 指定为整数。将 Seed 指定为 "shuffle" 会根据当前时间为生成器设定种子。

此参量设置 Seed 属性。

使用 randn 函数生成正态分布随机数时使用的正常转换算法,指定为 "BoxMuller""Inversion"

gentype"Threefry""Philox" 时,默认值为 "BoxMuller"。当 gentype"CombRecursive" 时,默认值为 "Inversion"

"BoxMuller" 选项仅支持 "Threefry""Philox" 生成器类型。

此参量设置 NormalTransform 属性。

当前流的流索引,指定为正整数。流索引用于在使用 parallel.gpu.RandStream.create 函数同时创建多个流时,识别每个流。

此参量设置 StreamIndex 属性。

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

使用 State 属性保存和恢复生成器的内部状态允许您重现一系列随机数。指定状态时,请使用之前从 parallel.gpu.RandStream 对象读取的值。或者,您可以使用 reset 将流返回可预测的状态,而无需事先从 State 属性中读取。

此参量设置 State 属性。

属性

全部展开

在对象创建后,此属性为只读属性。要设置此属性,请在创建流时使用 gentype 参量。

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

数据类型: char

要设置此属性,请在创建流时使用 Seed 参量,或使用 reset 函数。

随机数种子,指定为非负整数。种子指定了算法生成随机数的起点。当您想要可重现的结果时,请将 Seed 指定为整数。

使用 randn 函数生成正态分布随机数时使用的正常转换算法,指定为 'BoxMuller''Inversion'

gentype"Threefry""Philox" 时,默认值为 'BoxMuller'。当 gentype"CombRecursive" 时,默认值为 'Inversion'

'BoxMuller' 选项仅支持 "Threefry""Philox" 生成器类型。

数据类型: char

在对象创建后,此属性为只读属性。

创建当前流所在组中的流数,以正整数表示。使用函数 parallel.gpu.RandStream.create 一次创建多个流。

当前流的流索引,指定为正整数。流索引用于在使用 parallel.gpu.RandStream.create 函数同时创建多个流时,识别每个流。

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

使用 State 属性保存和恢复生成器的内部状态允许您重现一系列随机数。指定状态时,请使用之前从 parallel.gpu.RandStream 对象读取的值。或者,您可以使用 reset 将流返回可预测的状态,而无需事先从 State 属性中读取。

此 属性 为只读。

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

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

数据类型: logical

此 属性 为只读。

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

此属性始终为 1

数据类型: logical

对象函数

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

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