skip_ahead#

スキップアヘッド方式を使用してエンジンの状態を進めます。skip_ahead 関数は、スキップアヘッド方式を適用するため次のインターフェイスをサポートしています。

  • 共通インターフェイス

  • スキップされた要素のパーティション化された数とのインターフェイス

説明#

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

ブロック分割法

ブロック分割法

ブロック分割法#

スキップアヘッド法は、スキップアヘッドによる要素のスキップを許可する基本生成器でのみサポートされます。これは、生成器で要素を単純に生成してその後手動でスキップするよりも効率的です。詳細については VS ノートを参照してください。

準ランダム基本生成器の場合、スキップアヘッド法は、準ランダムベクトル全体ではなく、準ランダムベクトルのコンポーネントで機能することに注意してください。したがって、NS 準ランダムベクトルをスキップするには、num_to_skip パラメーターを num_to_skip *dim に設定します。ここで、dim は準ランダムベクトルの次元です。

スキップされた要素の数が 263 より大きい場合、スキップされた要素の分割された数を持つインターフェイスが使用されます。

関数の事前呼び出しは、以下に示すように、サイズ n のリストでスキップされた要素の数を表します。

num_to_skip[0]+ num_to_skip[1]*264+ num_to_skip[2]* 2128+ … +num_to_skip[n-1]*264*(n-1) ;

スキップされる要素の数が 263 未満の場合、両方のインターフェイスを使用できます。

次のコードは、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

ブロック分割方式をサポートする engine クラスのオブジェクト。

num_to_skip

std::uint64_t

スキップされた要素の数。

スキップされた要素のパーティション数を持つインターフェイス

名前

タイプ

説明

engine

Engine

ブロック分割方式をサポートする engine クラスのオブジェクト。

num_to_skip

std::initializer_list<std::uint64_t>

スキップされた要素のパーティション数。