ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

parallel.gpu.RandStream

GPU 上の乱数ストリーム

説明

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

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

作成

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

説明

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

s = parallel.gpu.RandStream('gentype',Name,Value) は、さらに 1 つ以上のオプションの Name,Value ペアを指定して、ストリームのプロパティを制御します。

入力引数

すべて展開する

乱数発生器アルゴリズム。有効な乱数発生器の文字ベクトルまたは 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 上の乱数ストリームを参照してください。

名前と値のペアの引数

オプションの Name,Value の引数ペアをコンマ区切りで指定します。Name は引数名で、Value は対応する値です。Name は引用符で囲まなければなりません。Name1,Value1,...,NameN,ValueN のように、複数の名前と値のペアの引数を任意の順序で指定できます。

乱数シード。'Seed' と、非負の整数、あるいは string または文字ベクトルの 'shuffle' からなるコンマ区切りのペアとして指定します。シードは、アルゴリズムが乱数を生成する開始点を指定します。再現可能な結果が必要な場合は、'Seed' を整数として指定します。'Seed''shuffle' として指定した場合、現在の時間に基づくシードが発生器に指定されます。

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

プロパティ

すべて展開する

このプロパティは読み取り専用です。

ストリームで使用される発生器アルゴリズム。

データ型: char

このプロパティは読み取り専用です。

ストリームの作成に使用するシード値

このプロパティは読み取り専用です。

現在のストリームが作成されたグループにあるストリーム数。

現在のストリームと共に作成したストリームのグループにおける現在のストリームのインデックス。

乱数ストリームの現在の状態。内部状態により、乱数ストリーム s によって生成される乱数列が決まります。この状態ベクトルのサイズは、選択された発生器によって異なります。

State プロパティを使用して発生器の内部状態を保存し復元することで、乱数列を再現できます。このプロパティを設定する場合、s.State に代入する値は、あらかじめ s.State から読み取った値でなければなりません。State プロパティからあらかじめ読み取らずにストリームを予測可能な状態に戻すには、reset を使用します。

randnを使用して正規分布の疑似乱数値を生成するために使用する変換アルゴリズム。

データ型: char

このプロパティは読み取り専用です。

S が対称な疑似乱数値 (一様な値の場合、1 から通常値を減算したもの) を生成するかどうかを示す logical 値。このプロパティは設定できません。

データ型: logical

このプロパティは読み取り専用です。

乱数ストリームが完全精度を使用して値を生成するかどうかを示す logical 値。double のビット数を確実にすべて設定するために、2 つの乱数が使用されます。このプロパティは変更できません。

データ型: logical

オブジェクト関数

parallel.gpu.RandStream.createGPU 上に独立した乱数ストリームを作成する
parallel.gpu.RandStream.listGPU の乱数発生器アルゴリズム
parallel.gpu.RandStream.getGlobalStreamGPU の現在のグローバル乱数ストリーム
parallel.gpu.RandStream.setGlobalStreamGPU のグローバル乱数ストリームを設定
reset (RandStream)乱数ストリームのリセット
rand (RandStream)一様分布の乱数
randi (RandStream)整数の一様分布の疑似乱数
randn (RandStream)正規分布の疑似乱数
randperm (RandStream)ランダム置換

すべて折りたたむ

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,10)
rG = rand(1,10, 'gpuArray')
rC =
    0.1726    0.9207    0.8108    0.7169    0.8697    0.7920    0.4159    0.6503    0.1025    0.6166

rG =
    0.1726    0.9207    0.8108    0.7169    0.8697    0.7920    0.4159    0.6503    0.1025    0.6166

rnC = randn(1,10)
rnG = randn(1,10, 'gpuArray')
rnC =
    -0.9438    1.4095    0.8807    0.5736    1.1250    0.8133   -0.2124    0.3862   -1.2673    0.2966

rnG =
    -0.9438    1.4095    0.8807    0.5736    1.1250    0.8133   -0.2124    0.3862   -1.2673    0.2966

R2011b で導入