uniform_bits#

32/64 ビットのチャンクに均一にされたビットを生成します。

説明#

uniform_bits クラス・オブジェクトは、32/64 ビットのチャンクに均一にされたビットを生成するために使用されます。32/64 ビットチャンク内の各ビットが均一にされるように設計されています。このは、philox4x32x10 および mcg59 エンジンでサポートされています。64 ビットのチャンクを生成する場合、2 倍のエンジンオフセットを提供する必要があります。

UIntType はチャンクサイズを示し、std::uint32_tstd::uint64_t のどちらかになります。詳細については VS ノートを参照してください。

API#

構文#

namespace oneapi::mkl::rng::device { 
  template<typename UIntType = std::uint32_t> 
  class uniform_bits { 
    using result_type = UIntType; 
  }; 
}

インクルード・ファイル#

  • oneapi/mkl/rng/device.hpp

テンプレート・パラメーター#

typename UIntType = std::uint32_t

生成された値のタイプ。固有の値は次のとおりです:

std::uint32_t std::uint64_t

小さなタイプを生成する例#

例 1#

uniform_bits は均一にされた生成器の出力を返すので、std::int8_tstd::uint8_tstd::int16_t、および std::uint16_t などの小さなタイプを取得するには、生成された数値を次に示すように目的のタイプに変換します。

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::uniform_bits<Type> distr; 

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

例 2#

生成された 1 つの番号から、小さいタイプの番号を複数取得することもできます。次の例は、1 つの std::uint8_t から 4 つの std::uint32_t 数値を取得する方法を示しています。

oneapi::mkl::rng::device::uniform_bits<std::uint32_t> distr; 

std::uint32_t res = oneapi::mkl::rng::device::generate(distr, engine); 
sycl::vec<std::uint8_t, 4> res_small; 
for (int i = 0; i < 4; ++i) { 
    res_small[i] = static_cast<std::uint8_t>(res & 0xff); 
    res >>= 8; 
}