API 参考#

定义

NVPL_RAND_VERSION#

NVPL RAND 库版本。

类型定义

typedef enum nvplRandRngType nvplRandRngType_t#

NVPL RAND 生成器类型。

typedef enum nvplRandDistributionType nvplRandDistributionType_t#

NVPL RAND 分布类型。

typedef struct nvplRandDistributionConfig nvplRandDistributionConfig_t#

用于描述数据分布属性的配置。

typedef enum nvplRandStatus nvplRandStatus_t#

NVPL RAND API 返回状态。

typedef enum nvplRandOrdering nvplRandOrdering_t#

多线程生成器内存中结果的排序类型。

枚举

enum nvplRandRngType#

NVPL RAND 生成器类型。

enumerator NVPL_RAND_RNG_PSEUDO_DEFAULT#

默认伪随机生成器,与 NVPL_RAND_RNG_PSEUDO_XORWOW 相同。

enumerator NVPL_RAND_RNG_PSEUDO_XORWOW#

XORWOW 伪随机生成器。

enumerator NVPL_RAND_RNG_PSEUDO_MRG32K3A#

MRG32K3A 伪随机生成器。

enumerator NVPL_RAND_RNG_PSEUDO_MT19937#

梅森旋转 MT19937 伪随机生成器。

enumerator NVPL_RAND_RNG_PSEUDO_PHILOX4_32_10#

PHILOX-4x32-10 伪随机生成器。

enumerator NVPL_RAND_RNG_PSEUDO_PCG#

PCG 伪随机生成器。

enumerator NVPL_RAND_RNG_QUASI_DEFAULT#

默认准随机生成器,与 NVPL_RAND_RNG_QUASI_SOBOL32 相同。

enumerator NVPL_RAND_RNG_QUASI_SOBOL32#

SOBOL32 准随机生成器。

enumerator NVPL_RAND_RNG_QUASI_SCRAMBLED_SOBOL32#

Scrambled SOBOL32 准随机生成器。

enumerator NVPL_RAND_RNG_QUASI_SOBOL64#

SOBOL64 准随机生成器。

enumerator NVPL_RAND_RNG_QUASI_SCRAMBLED_SOBOL64#

Scrambled SOBOL64 准随机生成器。

enum nvplRandDistributionType#

NVPL RAND 分布类型。

enumerator NVPL_RAND_CONTINUOUS_DIST_UNIFORM#

均匀分布,范围 (0,1]。

enumerator NVPL_RAND_CONTINUOUS_DIST_UNIFORM_RANGE#

均匀分布,具有自定义范围。

enumerator NVPL_RAND_CONTINUOUS_DIST_NORMAL#

正态分布.

enumerator NVPL_RAND_CONTINUOUS_DIST_LOGNORMAL#

对数正态分布。

enumerator NVPL_RAND_CONTINUOUS_DIST_EXPONENTIAL#

指数分布。

enumerator NVPL_RAND_CONTINUOUS_DIST_GAMMA#

伽玛分布。 仅伪随机生成器支持。

enumerator NVPL_RAND_CONTINUOUS_DIST_BETA#

贝塔分布。 仅伪随机生成器支持。

enumerator NVPL_RAND_CONTINUOUS_DIST_DIRICHLET#

狄利克雷分布。 仅伪随机生成器支持。

enumerator NVPL_RAND_DISCRETE_DIST_POISSON#

泊松分布。

enumerator NVPL_RAND_DISCRETE_DIST_BERNOULLI#

伯努利分布。

enumerator NVPL_RAND_DISCRETE_DIST_CATEGORICAL#

分类分布。

enumerator NVPL_RAND_DISCRETE_DIST_BINOMIAL#

二项分布。 仅伪随机生成器支持。

enumerator NVPL_RAND_DISCRETE_DIST_MULTINOMIAL#

多项分布。 仅伪随机生成器支持。

enum nvplRandStatus#

NVPL RAND API 返回状态。

enumerator NVPL_RAND_STATUS_SUCCESS#
enumerator NVPL_RAND_STATUS_GENERATOR_NOT_INITIALIZED#

生成器未初始化。

enumerator NVPL_RAND_STATUS_GENERATOR_TYPE_ERROR#

生成器类型错误。

enumerator NVPL_RAND_STATUS_DATA_NULLPTR#

数据 ptr 为 nullptr。

enumerator NVPL_RAND_STATUS_LENGTH_NOT_MULTIPLE#

请求的长度不是维度的倍数,或者不是二的倍数。

enumerator NVPL_RAND_STATUS_PCG_INCREMENT_NOT_ODD#

为 PCG 请求的增量不是奇数。

enumerator NVPL_RAND_STATUS_OUT_OF_RANGE#

参数超出范围。

enumerator NVPL_RAND_STATUS_DISTRIBUTION_CONFIGS_ERROR#

分布参数不可接受。

enumerator NVPL_RAND_STATUS_DISTRIBUTION_TYPE_ERROR#

生成器不支持分布类型。

enumerator NVPL_RAND_STATUS_INTERNAL_ERROR#

内部库错误。

enum nvplRandOrdering#

多线程生成器内存中结果的排序类型。

enumerator NVPL_RAND_ORDERING_PSEUDO_DEFAULT#

伪随机结果的默认排序。

enumerator NVPL_RAND_ORDERING_PSEUDO_FAST#

非严格排序,性能良好,但无法恢复偏移量。

enumerator NVPL_RAND_ORDERING_STRICT#

严格排序,生成与单线程结果相同的序列。

enumerator NVPL_RAND_ORDERING_CURAND_LEGACY#

伪随机的旧版序列,保证与 cuRAND 结果相同。

enumerator NVPL_RAND_ORDERING_QUASI_DEFAULT#

准随机结果的特定 n 维排序。

函数

nvplRandStatus_t nvplRandCreateGenerator(nvplRandGenerator_t *gen, nvplRandRngType_t rng_type)#

创建 rng_type 类型的新随机数生成器,并在 *gen 中返回它。

rng_type 的合法值是

  • NVPL_RAND_RNG_PSEUDO_DEFAULT

  • NVPL_RAND_RNG_PSEUDO_XORWOW

  • NVPL_RAND_RNG_PSEUDO_MRG32K3A

  • NVPL_RAND_RNG_PSEUDO_MT19937

  • NVPL_RAND_RNG_PSEUDO_PHILOX4_32_10

  • NVPL_RAND_RNG_PSEUDO_PCG

  • NVPL_RAND_RNG_QUASI_DEFAULT

  • NVPL_RAND_RNG_QUASI_SOBOL32

  • NVPL_RAND_RNG_QUASI_SCRAMBLED_SOBOL32

  • NVPL_RAND_RNG_QUASI_SOBOL64

  • NVPL_RAND_RNG_QUASI_SCRAMBLED_SOBOL64

rng_type 为 NVPL_RAND_RNG_PSEUDO_DEFAULT 时,选择的类型是 NVPL_RAND_RNG_PSEUDO_XORWOW。 当 rng_type 为 NVPL_RAND_RNG_QUASI_DEFAULT 时,选择的类型是 NVPL_RAND_RNG_QUASI_SOBOL32。

参数:
  • gen – 生成器指针

  • rng_type – 要创建的生成器类型

返回值:

  • NVPL_RAND_STATUS_GENERATOR_NOT_INITIALIZED 如果生成器未初始化

  • NVPL_RAND_STATUS_GENERATOR_TYPE_ERROR 如果 rng_type 的值无效

  • NVPL_RAND_STATUS_SUCCESS 如果生成器成功生成

nvplRandStatus_t nvplRandDestroyGenerator(nvplRandGenerator_t gen)#

销毁现有生成器并释放与其状态关联的所有内存。

参数:
  • gen – 要销毁的生成器

返回值:

  • NVPL_RAND_STATUS_GENERATOR_NOT_INITIALIZED 如果生成器从未创建

  • NVPL_RAND_STATUS_SUCCESS 如果生成器成功销毁

nvplRandStatus_t nvplRandGetVersion(int *version)#

返回 NVPL RAND 库的 version 号。

参数:
  • version – RAND 库版本

返回值:

  • NVPL_RAND_STATUS_SUCCESS 如果版本号成功返回

nvplRandStatus_t nvplRandSetPseudoRandomGeneratorSeed(nvplRandGenerator_t gen, const unsigned long long seed)#

设置伪随机数生成器的种子值。

种子的所有值均有效。不同的种子将产生不同的序列。不同的种子通常在统计上彼此不相关,但是某些种子值对可能会生成在统计上相关的序列。

默认值 seed

  • 0ULL,对于 NVPL_RAND_RNG_PSEUDO_XORWOW

  • 12345ULL,对于 NVPL_RAND_RNG_PSEUDO_MRG32K3A

  • 5489ULL,对于 NVPL_RAND_RNG_PSEUDO_MT19937

  • 0xdeadbeefdeadbeefULL,对于 NVPL_RAND_RNG_PSEUDO_PHILOX4_32_10

  • 0x853c49e6748fea9bULL,对于 NVPL_RAND_RNG_PSEUDO_PCG

参数:
  • gen – 要修改的生成器

  • seed – 种子值

返回值:

  • NVPL_RAND_STATUS_GENERATOR_NOT_INITIALIZED 如果生成器从未创建

  • NVPL_RAND_STATUS_GENERATOR_TYPE_ERROR 如果生成器不是伪随机数生成器

  • NVPL_RAND_STATUS_SUCCESS 如果生成器种子设置成功

nvplRandStatus_t nvplRandSetPCGRandomGeneratorIncrement(nvplRandGenerator_t gen, const unsigned long long inc)#

设置 PCG 伪随机数生成器的增量。

PCG 的增量值必须始终为奇数。 inc 的默认值为 0xda3e39cb94b95bdbULL。

参数:
  • gen – 要修改的生成器

  • inc – PCG 的增量值,控制选择哪个子序列

返回值:

  • NVPL_RAND_STATUS_GENERATOR_NOT_INITIALIZED 如果生成器从未创建

  • NVPL_RAND_STATUS_GENERATOR_TYPE_ERROR 如果生成器不是 PCG

  • NVPL_RAND_STATUS_PCG_INCREMENT_NOT_ODD 如果增量值为偶数

  • NVPL_RAND_STATUS_SUCCESS 如果生成器增量值设置成功

nvplRandStatus_t nvplRandSetGeneratorOffset(nvplRandGenerator_t gen, const unsigned long long offset)#

设置伪随机数或准随机数生成器的绝对偏移量。

偏移量的所有值均有效。偏移位置是绝对的,而不是相对于序列中的当前位置。

对于准随机生成器,偏移量是每个维度生成的序列中的绝对位置。

所有生成器的默认值 offset 均为 0ULL。

参数:
  • gen – 要修改的生成器

  • offset – 绝对偏移位置

返回值:

  • NVPL_RAND_STATUS_GENERATOR_NOT_INITIALIZED 如果生成器从未创建

  • NVPL_RAND_STATUS_SUCCESS 如果生成器偏移量设置成功

nvplRandStatus_t nvplRandSetGeneratorSubsequence(nvplRandGenerator_t gen, const unsigned long long seq)#

为伪随机数生成器设置子序列号。

为伪随机数生成器设置子序列或流编号,以允许用户显式跳过子序列。 生成伪随机数的多个子序列的能力允许使用单线程 NVPL RAND 库开发并行随机数生成。

子序列位置是绝对的,而不是相对于当前状态的子序列。

支持的伪随机生成器:XORWOW、MRG32K3A、PHILOX4_32_10 和 PCG。

除 MRG32K3a 外,它的最大子序列号为 \(2^{51}\),所有子序列值均有效。

建议 API 仅与单线程生成器一起使用。

参数:
  • gen – 要修改的生成器

  • seq – 要设置的子序列号

返回值:

  • NVPL_RAND_STATUS_GENERATOR_NOT_INITIALIZED 如果生成器从未创建

  • NVPL_RAND_STATUS_GENERATOR_TYPE_ERROR 如果生成器不支持 API

  • NVPL_RAND_STATUS_OUT_OF_RANGE 如果子序列号超出范围

  • NVPL_RAND_STATUS_SUCCESS 如果生成器子序列设置成功

nvplRandStatus_t nvplRandSetQuasiRandomGeneratorDimensions(nvplRandGenerator_t gen, const unsigned int num_dims)#

设置准随机数生成器的维度数。

当在 num_dims 维度中生成结果时,大小为 n 的输出将由来自 第一个 维度的 n / num_dims 个结果组成,后跟来自 第二个 维度的 n / num_dims 个结果,依此类推,直到最后一个维度。 只能生成维度大小的确切倍数。

num_dims 的合法值为 1 到 20000;默认值为 1。

参数:
  • gen – 要修改的生成器

  • num_dims – 维度数

返回值:

  • NVPL_RAND_STATUS_GENERATOR_NOT_INITIALIZED 如果生成器从未创建

  • NVPL_RAND_STATUS_OUT_OF_RANGE 如果维度数无效

  • NVPL_RAND_STATUS_GENERATOR_TYPE_ERROR 如果生成器不是准随机数生成器

  • NVPL_RAND_STATUS_SUCCESS 如果维度设置成功

nvplRandStatus_t nvplRandGenerate(nvplRandGenerator_t gen, unsigned int *outputPtr, const size_t num)#

使用 XORWOW、MRG32K3A、MT19937、PHILOX4_32_10、PCG、SOBOL32 和 Scrambled SOBOL32 生成器生成 32 位伪随机数或准随机数。

使用 gennum 个 32 位结果生成到 outputPtr 的内存中。 内存必须已预先分配,并且足够大以容纳所有结果。

结果是 32 位值,每个位都是随机的。

参数:
  • gen – 要使用的生成器

  • outputPtr – 指向存储生成结果的内存的指针

  • num – 要生成的随机 32 位值的数量

返回值:

  • NVPL_RAND_STATUS_GENERATOR_NOT_INITIALIZED 如果生成器从未创建

  • NVPL_RAND_STATUS_GENERATOR_TYPE_ERROR 如果生成器类型与数据类型不匹配

  • NVPL_RAND_STATUS_DATA_NULLPTR 如果 outputPtr 为 nullptr

  • NVPL_RAND_STATUS_LENGTH_NOT_MULTIPLE 如果输出样本的数量不是准随机维度的倍数

  • NVPL_RAND_STATUS_SUCCESS 如果结果成功生成

nvplRandStatus_t nvplRandGenerateLongLong(nvplRandGenerator_t gen, unsigned long long *outputPtr, const size_t num)#

生成 64 位伪随机数或准随机数,使用 PCG、SOBOL64 和 Scrambled SOBOL64 生成器。

使用 gen 生成 num 个 64 位结果到 outputPtr 指向的内存中。内存必须事先分配,并且足够大以容纳所有结果。

结果是 64 位值,每一位都是随机的。

参数:
  • gen – 要使用的生成器

  • outputPtr – 指向存储生成结果的内存的指针

  • num – 要生成的 64 位随机值的数量

返回值:

  • NVPL_RAND_STATUS_GENERATOR_NOT_INITIALIZED 如果生成器从未创建

  • 如果生成器类型不是 64 位生成器,则返回 NVPL_RAND_STATUS_GENERATOR_TYPE_ERROR

  • NVPL_RAND_STATUS_DATA_NULLPTR 如果 outputPtr 为 nullptr

  • NVPL_RAND_STATUS_LENGTH_NOT_MULTIPLE 如果输出样本的数量不是准随机维度的倍数

  • NVPL_RAND_STATUS_SUCCESS 如果结果成功生成

nvplRandStatus_t nvplRandGenerateUniform(nvplRandGenerator_t gen, float *outputPtr, const size_t num)#

生成均匀分布的浮点数。

使用 gen 生成 num 个浮点数结果到 outputPtr 指向的内存中。内存必须事先分配,并且足够大以容纳所有结果。

结果是 FP32 均匀分布的随机值,范围在 0 到 1 之间,不包括 0,包括 1。

参数:
  • gen – 要使用的生成器

  • outputPtr – 指向存储生成结果的内存的指针

  • num – 要生成的浮点数数量

返回值:

  • NVPL_RAND_STATUS_GENERATOR_NOT_INITIALIZED 如果生成器从未创建

  • NVPL_RAND_STATUS_DATA_NULLPTR 如果 outputPtr 为 nullptr

  • NVPL_RAND_STATUS_LENGTH_NOT_MULTIPLE 如果输出样本的数量不是准随机维度的倍数

  • NVPL_RAND_STATUS_SUCCESS 如果结果成功生成

nvplRandStatus_t nvplRandGenerateUniformDouble(nvplRandGenerator_t gen, double *outputPtr, const size_t num)#

生成均匀分布的双精度浮点数。

使用 generator 生成 num 个浮点数结果到 outputPtr 指向的内存中。内存必须事先分配,并且足够大以容纳所有结果。

结果是 FP64 均匀分布的随机值,范围在 0 到 1 之间,不包括 0,包括 1。

参数:
  • gen – 要使用的生成器

  • outputPtr – 指向存储生成结果的内存的指针

  • num – 要生成的双精度浮点数数量

返回值:

  • NVPL_RAND_STATUS_GENERATOR_NOT_INITIALIZED 如果生成器从未创建

  • NVPL_RAND_STATUS_DATA_NULLPTR 如果 outputPtr 为 nullptr

  • NVPL_RAND_STATUS_LENGTH_NOT_MULTIPLE 如果输出样本的数量不是准随机维度的倍数

  • NVPL_RAND_STATUS_SUCCESS 如果结果成功生成

nvplRandStatus_t nvplRandGenerateUniformRange(nvplRandGenerator_t gen, float *outputPtr, const size_t num, const float start, const float end)#

生成具有自定义范围的均匀分布浮点数。

使用 gen 生成 num 个浮点数结果到 outputPtr 指向的内存中。内存必须事先分配,并且足够大以容纳所有结果。

结果是 FP32 均匀分布的随机值,范围在 startend 之间,不包括 start,包括 end

参数:
  • gen – 要使用的生成器

  • outputPtr – 指向存储生成结果的内存的指针

  • num – 要生成的浮点数数量

  • start – 区间的起始值

  • end – 区间的结束值

返回值:

  • NVPL_RAND_STATUS_GENERATOR_NOT_INITIALIZED 如果生成器从未创建

  • NVPL_RAND_STATUS_DATA_NULLPTR 如果 outputPtr 为 nullptr

  • NVPL_RAND_STATUS_LENGTH_NOT_MULTIPLE 如果输出样本的数量不是准随机维度的倍数

  • NVPL_RAND_STATUS_SUCCESS 如果结果成功生成

nvplRandStatus_t nvplRandGenerateUniformRangeDouble(nvplRandGenerator_t gen, double *outputPtr, const size_t num, const double start, const double end)#

生成具有自定义范围的均匀分布双精度浮点数。

使用 gen 生成 num 个浮点数结果到 outputPtr 指向的内存中。内存必须事先分配,并且足够大以容纳所有结果。

结果是 FP64 均匀分布的随机值,范围在 startend 之间,不包括 start,包括 end

参数:
  • gen – 要使用的生成器

  • outputPtr – 指向存储生成结果的内存的指针

  • num – 要生成的双精度浮点数数量

  • start – 区间的起始值

  • end – 区间的结束值

返回值:

  • NVPL_RAND_STATUS_GENERATOR_NOT_INITIALIZED 如果生成器从未创建

  • NVPL_RAND_STATUS_DATA_NULLPTR 如果 outputPtr 为 nullptr

  • NVPL_RAND_STATUS_LENGTH_NOT_MULTIPLE 如果输出样本的数量不是准随机维度的倍数

  • NVPL_RAND_STATUS_SUCCESS 如果结果成功生成

nvplRandStatus_t nvplRandGenerateNormal(nvplRandGenerator_t gen, float *outputPtr, const size_t num, const float mean, const float stddev)#

生成正态分布的浮点数。

使用 gen 生成 num 个浮点数结果到 outputPtr 指向的内存中。内存必须事先分配,并且足够大以容纳所有结果。

结果是 FP32 正态分布的随机值,均值为 mean,标准差为 stddev

正态分布结果由伪随机生成器使用 Box-Muller 变换生成。准随机生成器使用逆累积分布函数 (ICDF) 来保持维度。

参数:
  • gen – 要使用的生成器

  • outputPtr – 指向存储生成结果的内存的指针

  • num – 要生成的浮点数数量

  • mean – 正态分布的均值

  • stddev – 正态分布的标准差

返回值:

  • NVPL_RAND_STATUS_GENERATOR_NOT_INITIALIZED 如果生成器从未创建

  • NVPL_RAND_STATUS_DATA_NULLPTR 如果 outputPtr 为 nullptr

  • 如果输出样本数不是准随机维度的倍数,或者对于伪随机生成器不是 2 的倍数,则返回 NVPL_RAND_STATUS_LENGTH_NOT_MULTIPLE

  • NVPL_RAND_STATUS_SUCCESS 如果结果成功生成

nvplRandStatus_t nvplRandGenerateNormalDouble(nvplRandGenerator_t gen, double *outputPtr, const size_t num, const double mean, const double stddev)#

生成正态分布的双精度浮点数。

使用 gen 生成 num 个浮点数结果到 outputPtr 指向的内存中。内存必须事先分配,并且足够大以容纳所有结果。

结果是 FP64 正态分布的随机值,均值为 mean,标准差为 stddev

正态分布结果由伪随机生成器(Mersenne Twister MT19937 除外)使用 Box-Muller 变换生成,因此要求 num 为偶数。准随机生成器和 Mersenne Twister MT19937 使用逆累积分布函数 (ICDF) 来保持维度。

参数:
  • gen – 要使用的生成器

  • outputPtr – 指向存储生成结果的内存的指针

  • num – 要生成的双精度浮点数数量

  • mean – 正态分布的均值

  • stddev – 正态分布的标准差

返回值:

  • NVPL_RAND_STATUS_GENERATOR_NOT_INITIALIZED 如果生成器从未创建

  • NVPL_RAND_STATUS_DATA_NULLPTR 如果 outputPtr 为 nullptr

  • 如果输出样本数不是准随机维度的倍数,或者对于伪随机生成器不是 2 的倍数,则返回 NVPL_RAND_STATUS_LENGTH_NOT_MULTIPLE

  • NVPL_RAND_STATUS_SUCCESS 如果结果成功生成

nvplRandStatus_t nvplRandGenerateDistribution(nvplRandGenerator_t gen, float *outputPtr, const nvplRandDistributionConfig_t config, const size_t num)#

基于指定的连续分布生成浮点数。

使用 gen 生成 num 个浮点数结果到 outputPtr 指向的内存中。内存必须事先分配,并且足够大以容纳所有结果。

结果是 FP32 随机值,具有用户指定的分布 config

正态分布结果由伪随机生成器(Mersenne Twister MT19937 除外)使用 Box-Muller 变换生成,因此要求 num 为偶数。准随机生成器和 Mersenne Twister MT19937 使用逆累积分布函数 (ICDF) 来保持维度。

参数:
  • gen – 要使用的生成器

  • outputPtr – 存储结果的内存指针

  • config – 分布的配置

  • num – 要生成的浮点数数量。对于多变量分布,例如狄利克雷分布,将生成 (num * config.nk) 个浮点数。

返回值:

  • NVPL_RAND_STATUS_GENERATOR_NOT_INITIALIZED 如果生成器从未创建

  • NVPL_RAND_STATUS_DATA_NULLPTR 如果 outputPtr 为 nullptr

  • 如果不支持分布类型,则返回 NVPL_RAND_STATUS_DISTRIBUTION_TYPE_ERROR

  • 如果分布配置设置不正确,或者不支持某些排序,则返回 NVPL_RAND_STATUS_DISTRIBUTION_CONFIGS_ERROR。请注意,Gamma、Beta 和 Dirichlet 分布不支持 NVPL_RAND_ORDERING_STRICT 排序

  • NVPL_RAND_STATUS_SUCCESS 如果结果成功生成

nvplRandStatus_t nvplRandGenerateDistributionDouble(nvplRandGenerator_t gen, double *outputPtr, const nvplRandDistributionConfig_t config, const size_t num)#

基于指定的连续分布生成双精度浮点数。

使用 gen 生成 num 个双精度浮点数结果到 outputPtr 指向的内存中。内存必须事先分配,并且足够大以容纳所有结果。

结果是 FP64 随机值,具有用户指定的分布 config

参数:
  • gen – 要使用的生成器

  • outputPtr – 存储结果的内存指针

  • config – 分布的配置

  • num – 要生成的浮点数数量。对于多变量分布,例如狄利克雷分布,将生成 (num * config.nk) 个双精度浮点数。

返回值:

  • NVPL_RAND_STATUS_GENERATOR_NOT_INITIALIZED 如果生成器从未创建

  • NVPL_RAND_STATUS_DATA_NULLPTR 如果 outputPtr 为 nullptr

  • 如果不支持分布类型,则返回 NVPL_RAND_STATUS_DISTRIBUTION_TYPE_ERROR

  • 如果分布配置设置不正确,或者不支持某些排序,则返回 NVPL_RAND_STATUS_DISTRIBUTION_CONFIGS_ERROR。请注意,Gamma、Beta 和 Dirichlet 分布不支持 NVPL_RAND_ORDERING_STRICT 排序

  • NVPL_RAND_STATUS_SUCCESS 如果结果成功生成

nvplRandStatus_t nvplRandGenerateDistributionDiscrete(nvplRandGenerator_t gen, unsigned int *outputPtr, const nvplRandDistributionConfig_t distConfig, const size_t num)#

基于指定的离散分布生成无符号整数。

使用 gen 生成 num 个整数结果到 outputPtr 指向的内存中。内存必须事先分配,并且足够大以容纳所有结果。

结果是 32 位随机整数值,具有用户指定的分布 config

参数:
  • gen – 要使用的生成器

  • outputPtr – 存储结果的内存指针

  • distConfig – 分布的配置

  • num – 要生成的无符号整数数量。对于多变量分布,例如多项分布,将生成 (num * config.nk) 个无符号整数。

返回值:

  • NVPL_RAND_STATUS_GENERATOR_NOT_INITIALIZED 如果生成器从未创建

  • NVPL_RAND_STATUS_DATA_NULLPTR 如果 outputPtr 为 nullptr

  • 如果不支持分布类型,则返回 NVPL_RAND_STATUS_DISTRIBUTION_TYPE_ERROR

  • 如果分布配置设置不正确,或者不支持某些排序,则返回 NVPL_RAND_STATUS_DISTRIBUTION_CONFIGS_ERROR。请注意,泊松分布不支持 NVPL_RAND_ORDERING_STRICT 排序

  • NVPL_RAND_STATUS_SUCCESS 如果结果成功生成

nvplRandStatus_t nvplRandMTCreateGenerator(nvplRandGenerator_t *gen, nvplRandRngType_t rng_type, const unsigned int nthreads)#

创建 rng_type 类型的新随机数生成器,将线程数设置为 nthreads,并在 *gen 中返回。

rng_type 的合法值是

  • NVPL_RAND_RNG_PSEUDO_DEFAULT

  • NVPL_RAND_RNG_PSEUDO_XORWOW

  • NVPL_RAND_RNG_PSEUDO_MRG32K3A

  • NVPL_RAND_RNG_PSEUDO_PHILOX4_32_10

  • NVPL_RAND_RNG_PSEUDO_PCG

  • NVPL_RAND_RNG_QUASI_DEFAULT

  • NVPL_RAND_RNG_QUASI_SOBOL32

  • NVPL_RAND_RNG_QUASI_SCRAMBLED_SOBOL32

  • NVPL_RAND_RNG_QUASI_SOBOL64

  • NVPL_RAND_RNG_QUASI_SCRAMBLED_SOBOL64

rng_typeNVPL_RAND_RNG_PSEUDO_DEFAULT 时,选择的类型是 NVPL_RAND_RNG_PSEUDO_XORWOW。当 rng_type 为 NVPL_RAND_RNG_QUASI_DEFAULT 时,选择的类型是 NVPL_RAND_RNG_QUASI_SOBOL32

该 API 只能在链接到多线程 NVPL RAND 库时使用。

参数:
  • gen – 生成器指针

  • rng_type – 要创建的生成器类型

  • nthreads – 用于生成随机数的线程数

返回值:

  • NVPL_RAND_STATUS_GENERATOR_NOT_INITIALIZED 如果生成器未初始化

  • NVPL_RAND_STATUS_GENERATOR_TYPE_ERROR 如果 rng_type 的值无效

  • NVPL_RAND_STATUS_SUCCESS 如果生成器成功生成

nvplRandStatus_t nvplRandMTCreateGeneratorDefault(nvplRandGenerator_t *gen, nvplRandRngType_t rng_type)#

创建 rng_type 类型的新随机数生成器,将线程数设置为 std::thread::hardware_concurrency() 的值,并在 *gen 中返回。

该 API 只能在链接到多线程 NVPL RAND 库时使用。

参数:
  • gen – 生成器指针

  • rng_type – 要创建的生成器类型

返回值:

  • NVPL_RAND_STATUS_GENERATOR_NOT_INITIALIZED 如果生成器未初始化

  • NVPL_RAND_STATUS_GENERATOR_TYPE_ERROR 如果 rng_type 的值无效

  • NVPL_RAND_STATUS_SUCCESS 如果生成器成功生成

nvplRandStatus_t nvplRandMTSetGeneratorOrdering(nvplRandGenerator_t gen, nvplRandOrdering_t order)#

设置伪随机数或准随机数生成器结果的排序。

order 对于伪随机生成器的合法值包括

  • NVPL_RAND_ORDERING_PSEUDO_DEFAULT

  • NVPL_RAND_ORDERING_PSEUDO_FAST

  • NVPL_RAND_ORDERING_STRICT

  • NVPL_RAND_ORDERING_CURAND_LEGACY

order 对于准随机生成器的合法值包括

  • NVPL_RAND_ORDERING_QUASI_DEFAULT

该 API 只能在链接到多线程 NVPL RAND 库时使用。

参数:
  • gen – 要修改的生成器

  • order – 结果的排序

返回值:

  • NVPL_RAND_STATUS_GENERATOR_NOT_INITIALIZED 如果生成器未初始化

  • 如果生成器不支持排序类型,则返回 NVPL_RAND_STATUS_GENERATOR_TYPE_ERROR

  • 如果生成器排序设置成功,则返回 NVPL_RAND_STATUS_SUCCESS

struct nvplRandDistributionConfig#

用于描述数据分布属性的配置。

公共成员

nvplRandDistributionType_t dist#

分布类型。

double a#

对于每种分布类型,双精度值 a

  • NVPL_RAND_CONTINUOUS_DIST_UNIFORM: 未使用

  • NVPL_RAND_CONTINUOUS_DIST_UNIFORM_RANGE : 范围 (start, end] 的起始值

  • NVPL_RAND_CONTINUOUS_DIST_NORMAL : 正态分布的均值

  • NVPL_RAND_CONTINUOUS_DIST_LOGNORMAL : 相关正态分布的均值

  • NVPL_RAND_CONTINUOUS_DIST_EXPONENTIAL : 指数分布的位置参数,\( \lambda \)

  • NVPL_RAND_CONTINUOUS_DIST_GAMMA : 形状参数,\( \alpha > 0 \)

  • NVPL_RAND_CONTINUOUS_DIST_BETA : 形状参数,\( \alpha > 0 \)

  • NVPL_RAND_CONTINUOUS_DIST_DIRICHLET: 未使用

  • NVPL_RAND_DISCRETE_DIST_POISSON : 速率参数,\( \lambda > 0 \)

  • NVPL_RAND_DISCRETE_DIST_BERNOULLI : 速率参数,\( 1 >= \lambda >= 0 \)

  • NVPL_RAND_DISCRETE_DIST_CATEGORICAL : 未使用

  • NVPL_RAND_DISCRETE_DIST_BINOMIAL : 速率参数,\( 1 >= \lambda >= 0 \)

double b#

对于每种分布类型,双精度值 b 仅需为以下分布定义

  • NVPL_RAND_CONTINUOUS_DIST_UNIFORM_RANGE : 范围 (start, end] 的结束值

  • NVPL_RAND_CONTINUOUS_DIST_NORMAL : 正态分布的标准差

  • NVPL_RAND_CONTINUOUS_DIST_LOGNORMAL : 相关正态分布的标准差

  • NVPL_RAND_CONTINUOUS_DIST_GAMMA : 尺度参数,\( \beta > 0 \)

  • NVPL_RAND_CONTINUOUS_DIST_BETA : 形状参数,\( \beta > 0 \)

double *p_array#

双精度数组 p_array 仅需为以下分布定义

  • NVPL_RAND_CONTINUOUS_DIST_DIRICHLET: 大小为 k 的形状参数数组,所有值 > 0

  • NVPL_RAND_DISCRETE_DIST_CATEGORICAL: 概率数组,所有值 >= 0

unsigned int nk#

无符号整数值 nk 仅需为以下分布定义

  • NVPL_RAND_CONTINUOUS_DIST_DIRICHLET: 形状参数的大小

  • NVPL_RAND_DISCRETE_DIST_CATEGORICAL: 概率参数的大小,>1 (如果 =1,请使用伯努利分布)

  • NVPL_RAND_DISCRETE_DIST_BINOMIAL : 伯努利试验的大小,>1 (如果 =1,请使用伯努利分布)

  • NVPL_RAND_DISCRETE_DIST_MULTINOMIAL : 概率参数的大小,>1

unsigned int nt#

无符号整数值 nt 仅需为以下分布定义

  • NVPL_RAND_DISCRETE_DIST_MULTINOMIAL : 伯努利试验的大小 >1