デバイス分布

デバイス分布#

oneMKL RNG ルーチンは、さまざまなタイプの分布を持つ乱数の生成に使用されます。各関数グループは、基礎となる分布タイプ別に以下で紹介されており、その機能の簡単な説明、呼び出しシーケンスの仕様、および入力および出力パラメーターの説明が含まれています。デバイス連続分布生成器テーブルとデバイス離散分布生成器テーブルには、乱数生成器ルーチンがデータタイプと出力分布とともにリストされ、生成器ルーチンのデータタイプと基本乱数生成器間の対応が設定されます。

デバイス連続分布生成器

分布のタイプ

データタイプ

BRNG データタイプ

説明

uniform (連続)

float、double

float、double

区間 [a,b) 上の一様連続分布

gaussian

float、double

float、double

正規分布 (ガウス分布)

exponential

float、double

float、double

指数分布

lognormal

float、double

float、double

対数正規分布

beta

float、double

float、double

ベータ分布

gamma

float、double

float、double

ガンマ分布

デバイス離散分布生成器

分布のタイプ

データタイプ

BRNG データタイプ

説明

uniform (離散)

整数

uniform_method::standard の場合は float 、ユニフォームメソッド::正確uniform_method::accurate の場合は double、64ビット整数の場合は生の出力

区間 [a,b) 上の一様離散分布

bits

整数

整数

基礎となる BRNG 整数シーケンスのビット

uniform_bits

整数

整数

32/64 ビットのチャンクに均一に分布されたビット

bernoulli

整数

float

ベルヌーイ分布

poisson

整数

double

ポアソン分布

  1. integer の場合は、サポートされているデータタイプで必要な分布を確認してください。

  2. sycl::half の連続的に分布する数値を取得するには、以下に示すように、生成された数値を sycl::half に変換します。

queue.submit([&](sycl::handler& cgh) { 
  cgh.parallel_for(sycl::range<1>(n / VecSize), [=](sycl::item<1> item) { 
      size_t item_id = item.get_id(0); 
      oneapi::mkl::rng::device::mcg59<VecSize> engine(seed, item_id * VecSize); 
      oneapi::mkl::rng::device::uniform<float> distr; 

      auto res = oneapi::mkl::rng::device::generate(distr, engine); 
      if constexpr(VecSize == 1) { 
          r_acc[item_id] = static_cast<sycl::half>(res); 
      } 
      else { 
          sycl::vec<sycl::half, VecSize> res_; 
          res_ = res.template convert<sycl::half>(); 
          res_.store(item_id, r_acc); 
      } 
  }); 
});