Main Content

parallel.gpu.RandStream

GPU 上の乱数ストリーム

説明

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

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

作成

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

説明

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

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

入力引数

すべて展開する

乱数発生器アルゴリズム。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 プロパティを設定します。

プロパティ

すべて展開する

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

ストリームで使用される発生器アルゴリズム。'Threefry4x64_20''Philox4x32_10'、または 'mrg32k3a' として指定します。

ストリームの作成時に、引数 gentype を使用してこのプロパティを設定します。

データ型: char

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

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

ストリームの作成時に、このプロパティを名前と値のペアとして設定します。

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

現在のストリームが作成されたグループにあるストリーム数。正の整数として指定します。関数 parallel.gpu.RandStream.create を使用して複数のストリームを一度に作成します。

現在のストリームのストリーム インデックス。正の整数として指定します。関数 parallel.gpu.RandStream.create を使用して複数のストリームを一度に作成するときに、ストリーム インデックスにより個々のストリームを識別します。

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

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

正規変換アルゴリズム。'BoxMuller または 'Inversion' として指定します。

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

データ型: char

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

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

このプロパティは常に 0 です。ストリームは対称値を生成しません。このプロパティは変更できません。

データ型: logical

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

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

このプロパティは常に 1 です。このプロパティは変更できません。

データ型: logical

オブジェクト関数

parallel.gpu.RandStream.createGPU 上に独立した乱数ストリームを作成する
parallel.gpu.RandStream.listGPU の乱数発生器アルゴリズム
parallel.gpu.RandStream.getGlobalStreamGPU の現在のグローバル乱数ストリーム
parallel.gpu.RandStream.setGlobalStreamGPU のグローバル乱数ストリームを設定
reset (RandStream)乱数ストリームのリセット

既定で、rand などの乱数発生関数を使用して GPU 上で乱数を作成するときには、乱数は GPU 上のグローバル乱数ストリームから取得されます。異なるストリームを指定するには、parallel.gpu.RandStream オブジェクトを作成し、それを最初の入力引数として渡します。たとえば、Philox 発生器アルゴリズムを使用して 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,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 で導入