Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

parallel.gpu.RandStream.create

GPU 上に独立した乱数ストリームを作成する

説明

s = parallel.gpu.RandStream.create('gentype') は、'gentype' で指定された乱数発生器アルゴリズムを使用する、単一の乱数ストリームを作成します。

メモ

parallel.gpu.RandStream オブジェクト作成関数は、単一のストリームを作成する場合のより簡潔な代替方法です。

[s1,s2,...] = parallel.gpu.RandStream.create('gentype','NumStreams',n) は、'gentype' で指定された乱数発生器アルゴリズムを使用する、n 個の乱数ストリームを作成します。ストリームは、疑似乱数の観点で独立しています。ストリームが、別の時点で作成されたストリームから必ずしも独立しているとは限りません。

[___] = parallel.gpu.RandStream.create('gentype',Name,Value) は、作成する独立したストリームの数など、ストリームの作成を制御する追加の Name,Value ペアも指定します。

すべて折りたたむ

同じ発生器、シードおよび正規変換をもつ複数の独立した乱数ストリーム作成できます。ここで、いくつかの独立したストリームを作成してから、それを使用して独立した乱数ストリームを生成します。

まず、ストリームを cell 配列として作成します。

streams = parallel.gpu.RandStream.create('Philox', 'NumStreams',3,'Seed',1,'NormalTransform','Inversion', 'CellOutput',true)
streams =

  1×3 cell array

    {1×1 parallel.gpu.RandStream}    {1×1 parallel.gpu.RandStream}    {1×1 parallel.gpu.RandStream}

これで、各ストリームを使用して乱数を生成できます。この例では、異なる乱数ストリームから生成した各行からなる行列を作成します。

x = zeros(3,10,'gpuArray');
for i=1:3
   x(i,:) = rand(streams{i},1,10);
end
x
x =

    0.5361    0.2319    0.7753    0.2390    0.0036    0.5262    0.8629    0.9974    0.9576    0.0054
    0.3084    0.3396    0.6758    0.5145    0.7909    0.7709    0.3386    0.1168    0.3694    0.0392
    0.5218    0.5625    0.7090    0.5854    0.5067    0.6528    0.5095    0.8777    0.3094    0.1100

入力引数

すべて折りたたむ

乱数発生器。複数のストリームとサブストリームをサポートする有効な乱数発生器の文字ベクトルまたは 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 個のストリーム)

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

例: parallel.gpu.RandStream.create('Philox')

名前と値の引数

オプションの引数ペアを Name1=Value1,...,NameN=ValueN として指定します。ここで、Name は引数名で、Value は対応する値です。名前と値の引数は他の引数の後になければなりませんが、ペアの順序は重要ではありません。

R2021a 以前は、名前と値をそれぞれコンマを使って区切り、Name を引用符で囲みました。

例: parallel.gpu.RandStream.create('Philox','Seed',10) は、'Philox' 発生器アルゴリズムとシード 10 を使用して単一の乱数ストリームを作成します。

作成する独立したストリームの数。'NumStreams' と非負の整数で構成されるコンマ区切りのペアとして指定します。ストリームは、疑似乱数の観点で独立しています。ストリームが、別の時点で作成されたストリームから必ずしも独立しているとは限りません。

この関数呼び出しで作成されるストリームのインデックス。'StreamIndices' と、非負の整数または非負の整数のベクトルで構成されるコンマ区切りのペアとして指定します。既定値は 1:N です。ここで、N'NumStreams' パラメーターで指定した値です。

'StreamIndices' に指定する値は、'NumStreams' に指定する値以下でなければなりません。

初期化されるすべてのストリームの乱数シード。'Seed' と非負の整数で構成されるコンマ区切りのペアとして指定します。シードは、アルゴリズムが乱数を生成する開始点を指定します。

関数 randn を使用して生成される、正規分布乱数の変換アルゴリズム。'NormalTransform' と、アルゴリズム名 'BoxMuller' または 'Inversion' のコンマ区切りのペアとして指定します。'BoxMuller' アルゴリズムは、'Threefry および 'Philox' の各発生器でサポートされています。'Inversion' アルゴリズムは 'CombRecursive' 発生器でサポートされています。GPU 上でサポートされている他の変換アルゴリズムはありません。

ストリーム オブジェクトを cell 配列の要素として返すかどうかを示す論理フラグ。'CellOutput' と、logical 値 0 または 1 で構成されるコンマ区切りのペアとして指定します。既定値は false です。

出力引数

すべて折りたたむ

GPU 上で乱数を生成するための乱数ストリーム。parallel.gpu.RandStream オブジェクトとして返されます。

ヒント

  • parallel.gpu.RandStream.create を複数回呼び出して、複数のストリームを作成する場合、ストリームは必ずしも互いに独立していません。parallel.gpu.RandStream.create の個別の呼び出しから、独立したストリームを作成するには、次を行います。

    • 各ケースで gentype'NumStreams' および 'Seed' に同じ値のセットを指定します。

    • 各ケースで 1'NumStreams' 値の間にある 'StreamIndices' に異なる値を指定します。

バージョン履歴

R2011b で導入