leapfrog#
リープフロッグ方式を使用してエンジンの状態を続行します。
説明#
leapfrog 関数は、非ユニットストライドを持つエンジンで乱数を生成します。この機能は、元のランダムシーケンスを生成せずに、元のストリームからストライドバッファー全体に乱数を分布し、その後手動で分布するのに便利です。
リープフロッグ法の重要な応用例の 1 つは、元のシーケンスをストライド計算ノード間で重複しないサブシーケンスに分割することです。この関数は、元の乱数ストリーム (次の図を参照) を初期化して、計算ノード idx, 0 ≤ idx < stride の乱数を生成します。ここで、stride は使用される計算ノードの最大数です。
リープフロッグ法

リープフロッグ法#
リープフロッグ法は、リープフロッグ法による要素の分割を許可する基本生成器に対してのみサポートされます。これは、生成器によって要素を単純に生成し、その後計算ノード全体に手動で分布するよりも効率的です。詳細については VS ノートを参照してください。
次のコードは、リープフロッグ法を使用して 3 つの独立したストリームを初期化する方法を示します。
リープフロッグ法のコード#
1 // 3 つの同一のエンジンを作成
2 mkl::rng::mcg31m1 engine_1(queue, seed);
3
4
5 mkl::rng::mcg31m1 engine_2(engine_1);
6 mkl::rng::mcg31m1 engine_3(engine_1);
7
8
9 // エンジンの状態を飛躍的に向上させる
10 mkl::rng::leapfrog(engine_1, 0 , 3);
11 mkl::rng::leapfrog(engine_2, 1 , 3);
12 mkl::rng::leapfrog(engine_3, 2 , 3);
13 // 乱数を生成
14 ...API#
構文#
namespace oneapi::mkl::rng {
template<typename Engine>
void leapfrog (Engine& engine,
std::uint64_t idx,
std::uint64_t stride)
}インクルード・ファイル#
oneapi/mkl/rng.hpp
入力パラメーター#
名前 |
タイプ |
説明 |
|---|---|---|
engine |
|
リープフロッグをサポートするエンジンクラスのオブジェクト。 |
idx |
|
計算ノードのインデックス。 |
stride |
|
計算ノードの最大数、またはストライド。 |