skip_ahead#
スキップアヘッド方式を使用してエンジンの状態を進めます。skip_ahead
関数は、スキップアヘッド方式を適用するため次のインターフェイスをサポートしています。
共通インターフェイス
スキップされた要素のパーティション化された数とのインターフェイス
説明#
skip_ahead
関数は、エンジンによって提供されるランダムシーケンス内の指定された数の要素をスキップします。この機能は、元のエンジンからの乱数を異なる計算ノードに分散させる場合に特に役立ちます。計算ノードで使用される乱数の最大数が num_to_skip
である場合、元の乱数シーケンスは skip_ahead
によって num_to_skip サイズの重複しないブロックに分割され、各ブロックがそれぞれの計算ノードに対応するようになります。計算ノードの数は無制限です。この方法は、ブロック分割方式またはスキップアヘッド方式として知られています (次の図を参照)。
ブロック分割法

ブロック分割法#
スキップアヘッド法は、スキップアヘッドによる要素のスキップを許可する基本生成器でのみサポートされます。これは、生成器で要素を単純に生成してその後手動でスキップするよりも効率的です。詳細については VS ノートを参照してください。
準ランダム基本生成器の場合、スキップアヘッド法は、準ランダムベクトル全体ではなく、準ランダムベクトルのコンポーネントで機能することに注意してください。したがって、NS 準ランダムベクトルをスキップするには、num_to_skip
パラメーターを num_to_skip
*dim に設定します。ここで、dim
は準ランダムベクトルの次元です。
スキップされた要素の数が
関数の事前呼び出しは、以下に示すように、サイズ n
のリストでスキップされた要素の数を表します。
num_to_skip
[0]+ num_to_skip
[1]*264+ num_to_skip
[2]* 2128+ … +num_to_skip
[n-1]*264*(n-1) ;
スキップされる要素の数が
次のコードは、skip_ahead
関数を使用して 3 つの独立したストリームを初期化する方法を示しています。
ブロック分割法のコード#
1 ...
2 // 3 つの同一のエンジンを作成
3 oneapi::mkl::rng::mcg31m1 engine_1(queue, seed);
4 oneapi::mkl::rng::mcg31m1 engine_2(engine_1);
5 oneapi::mkl::rng::mcg31m1 engine_3(engine_2);
6
7
8 // 7 要素先へスキップする 2 番目のエンジン
9 oneapi::mkl::rng::skip_ahead(engine_2, 7);
10
11
12 // 14 要素先へスキップする 3 番目のエンジン
13 oneapi::mkl::rng::skip_ahead(engine_3, 14);
14 ...
パーティション化された要素数を持つブロック分割法のコード#
1 // 最初のエンジンの作成
2 oneapi::mkl::rng::mrg32k3a engine_1(queue, seed);
3
4
5 // ランダムストリーム内の 2^64 個の要素をスキップするには、スキップする要素の数は
6 // num_to_skip = 2^64 = 0 + 1 * 2^64 と表す必要があります。
7 std::initializer_list<std::uint64_t> num_to_skip = {0, 1};
8
9
10
11
12 // 1 番目のエンジンに基づいて 2 番目のエンジンを作成。 2^64 スキップ
13 oneapi::mkl::rng::mrg32k3a engine_2(engine_1);
14 oneapi::mkl::rng::skip_ahead(engine_2, num_to_skip);
15
16
17 // 2 番目のエンジンをベースに 3 番目のエンジンを作成。 2^64 スキップ
18 oneapi::mkl::rng::mrg32k3a engine_3(engine_2);
19 oneapi::mkl::rng::skip_ahead(engine_3, num_to_skip);
20 ...
API#
構文#
共通インターフェイス
namespace oneapi::mkl::rng {
template<typename Engine>
void skip_ahead (Engine& engine,
std::uint64_t num_to_skip)
}
スキップされた要素のパーティション数を持つインターフェイス
namespace oneapi::mkl::rng {
template<typename Engine>
void skip_ahead (Engine& engine,
std::initializer_list<std::uint64_t> num_to_skip)
}
インクルード・ファイル#
oneapi/mkl/rng.hpp
入力パラメーター#
共通インターフェイス
名前 |
タイプ |
説明 |
---|---|---|
engine |
|
ブロック分割方式をサポートする engine クラスのオブジェクト。 |
num_to_skip |
|
スキップされた要素の数。 |
スキップされた要素のパーティション数を持つインターフェイス
名前 |
タイプ |
説明 |
---|---|---|
engine |
|
ブロック分割方式をサポートする engine クラスのオブジェクト。 |
num_to_skip |
|
スキップされた要素のパーティション数。 |