Random Number Generators Device Routines#

The main purpose of Device routines is to make them callable from your SYCL kernels; however, there are no limitations to be called from the Host. For example:

sycl::queue queue;

queue.submit([&](sycl::handler& cgh) {
  cgh.parallel_for(range,[=](...) {
     oneapi::mkl::rng::device::routine(...); // calling routine from user's kernel code
  });
});

oneapi::mkl::rng::device::routine(...); // calling routine from host

Structure

RNG domain contains two classes types:

  • Engines (basic random number generators) classes, which holds the state of generator and is a source of independent and identically distributed random variables. Refer to Host Engines (Basic Random Number Generators) for a detailed description.

  • Distribution classes templates (transformation classes) for different types of statistical distributions, for example, uniform, normal (Gaussian), binomial, etc. These classes contain all of the distribution’s parameters (including generation method). Refer to Device Distributions for a detailed description of the distributions.

The RNG domain also contains two types of free functions:

  • Generation routines. The current routines are used to obtain random numbers from a given engine with proper statistics defined by a given distribution. Refer to the Device Generate Routines section for a detailed description.

  • Service routines. The routines are used to modify the engine state. Refer to Device Service Routines for a description of these routines.

Engine classes work with both generation and service routines. Distribution classes are used in generation routines only. Refer to the oneMKL RNG Device Usage Model section for the description of typical RNG scenario.

Parent topic: Random Number Generators