Main Content

gpurng

GPU での乱数発生の制御

説明

gpurng("default") は、既定のアルゴリズムとシードを使用して、GPU の乱数発生器を初期化します。既定のアルゴリズムは、シードが 0Threefry 発生器です。生成される乱数は MATLAB® を再起動した場合と同じです。

関数 gpurng は GPU のグローバル ストリームを制御します。このストリームは、関数 randrandirandn、および randperm が GPU 上で乱数列をどのように発生させるかを決定します。GPU のグローバル ストリームとは別に 1 つ以上の独立したストリームを作成するには、parallel.gpu.RandStream を参照してください。

gpurng(seed) は、現在の発生器アルゴリズムを使用する GPU 乱数発生器のシードを指定します。

  • gpurng(1) のように seed に非負の整数を指定すると、そのシードを使用して GPU 乱数発生器が初期化されます。

  • seed"shuffle" を指定すると、発生器のシードが現在の時刻に基づいて初期化されるため、gpurng を呼び出すたびに、randrandirandn、および randperm では異なる数列が発生します。

gpurng(seed,generator) は、GPU 乱数発生器で使用されるアルゴリズムも指定します。たとえば、gpurng(2,"philox") はシード 2 を使用して Philox 4x32 発生器を初期化します。

gpurng(generator) は、GPU 乱数発生器で使用されるアルゴリズムと、シード 0 を指定します。この構文は gpurng(0,generator) と等価です。 (R2023b 以降)

gpurng(S) は、TypeSeed、および State のフィールドをもつ構造体 S に含まれる設定に基づいて、乱数発生器の状態を初期化します。構造体 S は、前回の S = gpurng または S = gpurng(__) の呼び出しで返された構造体でなければなりません。

S = gpurng は、乱数発生器の現在の状態を、TypeSeed、および State のフィールドをもつ構造体 S として返します。

S = gpurng(___) は、乱数発生器の現在の状態を構造体 S で返してから、指定された引数を使用して設定を変更します。

メモ

MATLAB の基本設定ウィンドウに表示された乱数発生器の既定のアルゴリズムとシードは、CPU 上で生成される乱数にのみ影響し、gpurng("default") の呼び出しには影響しません。

すべて折りたたむ

GPU の発生器の設定をキャプチャし、CPU の乱数発生器の状態を GPU の発生器の設定と一致するように設定します。GPU および CPU 上に予測可能な乱数配列を作成します。

CPU および GPU の両方で、発生器タイプとシードを既定値に復元します。

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

GPU の乱数発生器の既定のシードおよび発生器タイプを保存します。

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

GPU の既定の設定と一致するように CPU の乱数発生器を設定します。

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 で同じです。

Threefry 発生器について、既定で CPU は Ziggurat 変換を使用しますが、GPU は BoxMuller アルゴリズムを使用します。CPU と GPU の両方でサポートされている唯一の変換メソッドは Inversion 変換です。

GPU 上の変換メソッドは、parallel.gpu.RandStreamを使用して変更できます。

入力引数

すべて折りたたむ

乱数シード。非負の整数または "shuffle" として指定します。シードは、アルゴリズムが乱数を生成する開始点を指定します。再現可能な結果が必要な場合、シードを非負の整数として指定します。既定のシードは 0 です。

シードを "shuffle" として指定すると、ソフトウェアにより発生器のシードが現在の時刻に基づいて初期化されるため、gpurng を呼び出すたびに異なる乱数列が発生します。

例: gpurng(7)

乱数発生器。複数のストリームとサブストリームをサポートする有効な乱数発生器の文字ベクトルまたは string として指定します。GPU では 3 つの乱数発生器アルゴリズムがサポートされています。

キーワード発生器複数のストリームとサブストリームのサポート完全精度での近似周期
"Threefry" または "Threefry4x64_20"Threefry 4x64 発生器、20 ラウンドあり2514 (長さが 2258 の 2256 個のストリーム)
"Philox" または "Philox4x32_10"Philox 4x32 発生器、10 ラウンドあり2193 (長さが 2129 の 264 個のストリーム)
"CombRecursive" または "mrg32k3a"結合多重再帰発生器あり2191 (長さが 2127 の 263 個のストリーム)

既定の発生器は Threefry です。

GPU および CPU での乱数発生の違いの詳細については、ワーカー上の乱数ストリームの制御を参照してください。

例: gpurng("Philox")

乱数発生器の以前の状態。S = gpurng を使用して以前に作成した構造体として指定します。

例: S = gpurng は乱数発生器の現在の状態をキャプチャし、gpurng(S) は発生器をその設定に復元します。

データ型: struct

出力引数

すべて折りたたむ

乱数発生器の状態。TypeSeed および State のフィールドをもつ構造体として返されます。

例: S = gpurng は乱数発生器の現在の状態をキャプチャし、gpurng(S) は発生器をその設定に復元します。

データ型: struct

拡張機能

バージョン履歴

R2011b で導入

すべて展開する