メインコンテンツ

parallel.gpu.RandStream

GPU 上の乱数ストリーム

説明

GPU 上のグローバル乱数ストリームを制御し、GPU 上に複数の独立したストリームを作成するには、parallel.gpu.RandStream を使用します。GPU 上で乱数を生成する場合、数値は GPU の乱数ストリームから取得されます。このストリームは、CPU 上のクライアント MATLAB® セッションの乱数ストリームとは異なります。

GPU 上で乱数を作成するには、乱数発生器関数 randrandi および randn を使用します。GPU の乱数ストリームを使用する場合、結果は gpuArray として返されます。既定で、これらの関数は GPU のグローバル乱数ストリームから数値を取得します。異なるストリームを使用するには、オブジェクト関数で説明されている構文に従います。

作成

単一の parallel.gpu.RandStream オブジェクトを作成するには、次の構文を使用します。複数の独立したストリームを同時に作成する場合は、関数 parallel.gpu.RandStream.create を使用します。

説明

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

s = parallel.gpu.RandStream(gentype,Name=Value) では、発生器アルゴリズムの引数に加えて、1 つ以上の名前と値の引数を使用してオプションを指定します。現在の時刻に基づいて乱数発生器のシードを設定するには、Seed"shuffle" に設定します。

入力引数

すべて展開する

乱数発生器アルゴリズム。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 上の乱数ストリームを参照してください。

この引数は 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

ストリームを作成するか、reset 関数を使用する場合、このプロパティを設定するには、引数 Seed を使用します。

乱数シード。非負の整数として指定します。シードは、アルゴリズムが乱数を生成する開始点を指定します。再現可能な結果が必要な場合は、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) として表されます。このプロパティは、乱数ストリームが完全精度を使用して値を生成するかどうかを示します。double のビット数を確実にすべて設定するために、2 つの乱数が使用されます。

このプロパティは常に 1 です。

データ型: logical

オブジェクト関数

parallel.gpu.RandStream.createCreate independent random number streams on a GPU
parallel.gpu.RandStream.listGPU の乱数発生器アルゴリズムをリスト
parallel.gpu.RandStream.getGlobalStreamGPU の現在のグローバル乱数ストリームを取得
parallel.gpu.RandStream.setGlobalStreamGPU のグローバル乱数ストリームを設定
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)
他の入力引数の詳細については、randrandi、および randn を参照してください。

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 上で、関数 randrandi および randn"Philox" 発生器アルゴリズムを使用して、新しいグローバル ストリームから乱数を取得します。

GPU と CPU で同じ乱数を生成する必要のあるアプリケーションの場合、一致するストリームを設定できます。GPU と CPU の両方で一致するストリームを作成し、それぞれにおいて、それらをグローバル ストリームとして設定します。

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

Inversion 正規変換アルゴリズムのみが、GPU と CPU の両方で使用できます。

これらのストリームを GPU と CPU でそれぞれ、グローバル ストリームとして設定します。

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

これにより、rand および randn を呼び出すと、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 で導入