Main Content

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

gpurng

控制 GPU 上的随机数生成

说明

gpurng("default") 使用默认算法和种子初始化 GPU 随机数生成器。默认算法是带有种子 0Threefry 生成器。产生的随机数与您重新启动 MATLAB® 时产生的随机数相同。

gpurng 函数控制全局 GPU 流,它决定了 randrandirandnrandperm 函数如何在 GPU 上产生随机数序列。要创建一个或多个独立于全局 GPU 流的独立流,请参阅 parallel.gpu.RandStream

gpurng(seed) 使用当前生成器算法指定 GPU 随机数生成器的种子。

  • seed 指定为非负整数,例如 gpurng(1),以使用该种子初始化 GPU 随机数生成器。

  • seed 指定为 "shuffle",根据当前时间初始化生成器种子,以便 randrandirandnrandperm 在每次调用 gpurng 后产生不同的数字序列。

gpurng(seed,generator) 还指定了 GPU 随机数生成器使用的算法。例如,gpurng(2,"philox") 使用 2 种子初始化 Philox 4x32 生成器。

示例

gpurng(generator) 指定 GPU 随机数生成器使用的算法,种子为 0。此语法相当于 gpurng(0,generator) (自 R2023b 起)

gpurng(S) 根据结构 S(包含字段 TypeSeedState)中包含的设置来初始化随机数生成器的状态。结构 S 必须是之前调用 S = gpurngS = gpurng(__) 返回的结构。

S = gpurng 将随机数生成器的当前状态作为结构 S 返回,其中包含字段 TypeSeedState

S = gpurng(___) 返回结构 S 中随机数生成器的当前状态,然后再使用指定的参量更改设置。

注意

MATLAB 预设项 窗口中随机数生成器的默认算法和种子仅影响在 CPU 上生成的随机数,而不会影响对 gpurng("default") 的调用。

示例

全部折叠

捕获 GPU 生成器设置,并设置 CPU 随机数生成器的状态以匹配 GPU 生成器设置。在 CPU 和 GPU 上创建可预测的随机数数组。

将 CPU 和 GPU 上的生成器类型和种子恢复为默认值。

gpurng("default") 
rng("default")

保存 GPU 随机数生成器的默认种子和生成器类型。

GPUdef = gpurng
GPUdef = struct with fields:
     Type: 'threefry'
     Seed: 0
    State: [17×1 uint32]

将 CPU 随机数生成器设置为与默认 GPU 设置相匹配。

rng(GPUdef) 

在 GPU 上创建均匀分布的随机数组。

rGPU = rand(1,10,"gpuArray")
rGPU =

    0.3640    0.5421    0.6543    0.7436    0.0342    0.8311    0.7040    0.2817    0.1163    0.5671

在 CPU 上创建一个随机数数组。

rCPU = rand(1,10)
rCPU = 1×10

    0.3640    0.5421    0.6543    0.7436    0.0342    0.8311    0.7040    0.2817    0.1163    0.5671

GPU 和 CPU 的种子和生成器类型相同,因此数组相同。

isequal(rGPU,rCPU)
ans = logical
   1

gpurng 状态不会保存用于生成一组正态分布的随机数的转换的设置。即使 GPU 和 CPU 上的种子和生成器类型相同,但正态分布的随机数集合却不同。

nGPU = randn(1,1000,"gpuArray");
nCPU = randn(1,1000);

figure
hold on
histogram(nGPU)
histogram(nCPU)
legend("GPU","CPU")
title("Normally Distributed Random Numbers")
xlabel("Value")
ylabel("Count")
hold off

Figure contains an axes object. The axes object with title Normally Distributed Random Numbers, xlabel Value, ylabel Count contains 2 objects of type histogram. These objects represent GPU, CPU.

随机数的正态分布的统计数据在 GPU 和 CPU 上是相同的。

默认情况下,CPU 使用 Ziggurat 转换,而 GPU 对 Threefry 生成器使用 BoxMuller 算法。CPU 和 GPU 上支持的唯一转换方法是 Inversion 转换。

您可以使用 parallel.gpu.RandStream 更改 GPU 上的转换方法。

输入参数

全部折叠

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

当您将种子指定为 "shuffle" 时,软件会根据当前时间初始化生成器种子,从而每次调用 gpurng 后都会产生不同的随机数序列。

示例: gpurng(7)

随机数生成器,指定为支持多个流和子流的任何有效随机数生成器的字符向量或字符串。GPU 支持三种随机数生成器算法。

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

默认生成器是 Threefry

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

示例: gpurng("Philox")

先前的随机数生成器状态,指定为先前使用 S = gpurng 创建的结构。

示例: S = gpurng 捕获随机数生成器的当前状态,而 gpurng(S) 将生成器恢复到那些设置。

数据类型: struct

输出参量

全部折叠

随机数生成器状态,以具有字段 TypeSeedState 的结构返回。

示例: S = gpurng 捕获随机数生成器的当前状态,而 gpurng(S) 将生成器恢复到那些设置。

数据类型: struct

扩展功能

版本历史记录

在 R2011b 中推出

全部展开