生成器选项#

随机数生成器一旦创建,可以根据需要使用多个选项进行修改。

种子#

种子参数是一个 64 位整数,用于初始化伪随机数生成器的起始状态。相同的种子始终产生相同的结果序列。每个生成器的默认种子都不同,详情请参阅 nvplRandSetPseudoRandomGeneratorSeed()

偏移量#

偏移量参数用于在序列中向前跳过。如果 offset = 100,则生成的第一个随机数将是序列中的第 100 个。这允许同一程序的多次运行从同一序列继续生成结果,而不会重叠。默认偏移量为零。

子序列#

子序列参数用于在伪随机数生成器的子序列中向前跳过。如果 offset = 10 且 subsequence = 100,则生成的第一个随机数将是第 100 个子序列中的第 10 个。生成伪随机数的多个子序列的能力允许使用单线程 NVPL RAND 库开发并行随机数生成。默认子序列为零。

维度#

维度参数用于设置准随机数生成器要生成的维度数。当在 d 维度中生成结果时,大小为 n 的输出将由来自第 1 维度的 n / d 个结果组成,然后是来自第 2 维度的 n / d 个结果,依此类推,直到第 d 维度。只能生成维度大小的精确倍数;否则返回 NVPL_RAND_STATUS_LENGTH_NOT_MULTIPLE 状态。默认维度数为 1。

增量#

增量参数用于设置 PCG 伪随机生成器的增量值。增量值控制选择哪个子序列来生成 PCG 随机数 [4]。为 PCG 以外的任何生成器设置增量参数将返回 NVPL_RAND_STATUS_GENERATOR_TYPE_ERROR。参数必须始终为奇数;否则返回 NVPL_RAND_STATUS_PCG_INCREMENT_NOT_ODD 状态。有关默认增量值,请参阅 nvplRandSetPCGRandomGeneratorIncrement()

顺序#

顺序参数用于选择结果在内存中的排序方式。它也直接影响生成函数的性能。

注意

NVPL_RAND_RNG_PSEUDO_MT19937 在当前版本中仅支持单线程随机数生成。因此,为 MT19937 生成器设置顺序参数将返回 NVPL_RAND_STATUS_GENERATOR_TYPE_ERROR

伪随机序列有四种排序选择

  • NVPL_RAND_ORDERING_PSEUDO_DEFAULT,

  • NVPL_RAND_ORDERING_PSEUDO_FAST,

  • NVPL_RAND_ORDERING_STRICT,

  • NVPL_RAND_ORDERING_CURAND_LEGACY.

准随机数有一种排序选择:NVPL_RAND_ORDERING_QUASI_DEFAULT

伪随机数生成器的默认顺序为 NVPL_RAND_ORDERING_PSEUDO_DEFAULT,而准随机数生成器的默认排序为 NVPL_RAND_ORDERING_QUASI_DEFAULT

使用这些参数获得的排序是确定性的,并且如果使用相同数量的线程,则每次程序运行时都相同。

注意

  • NVPL_RAND_ORDERING_PSEUDO_DEFAULT 顺序对于所有多线程伪随机生成器都是 NVPL_RAND_ORDERING_PSEUDO_FAST

  • NVPL_RAND_ORDERING_STRICT 顺序提供良好的性能,并保证完全相同的序列,而与使用的线程数无关。

  • NVPL_RAND_ORDERING_STRICT 顺序还提供与单线程 NVPL RAND 库生成的序列完全相同的序列。

  • 由于为 Gamma、Beta、Dirichlet 和 Poisson 分布生成一个值需要可变数量的状态更改,NVPL_RAND_ORDERING_STRICT 顺序不支持这些分布。如果为生成这四种分布中的任何一种值设置 NVPL_RAND_ORDERING_STRICT 顺序,则返回 NVPL_RAND_STATUS_DISTRIBUTION_CONFIGS_ERROR

  • NVPL_RAND_ORDERING_PSEUDO_FAST 顺序通常提供最佳性能,但如果使用不同数量的线程,则序列会发生变化。

  • NVPL_RAND_ORDERING_CURAND_LEGACY 顺序保证与使用 CURAND_ORDERING_PSEUDO_LEGACY 顺序生成的 cuRAND 结果完全相同的序列(请参阅 CURAND_ORDERING_PSEUDO_LEGACY)。但是,由于内存访问模式,NVPL_RAND_ORDERING_CURAND_LEGACY 顺序的性能可能比 NVPL_RAND_ORDERING_STRICTNVPL_RAND_ORDERING_PSEUDO_FAST 顺序慢得多。

  • NVPL_RAND_ORDERING_QUASI_DEFAULT 顺序保证与使用相同 SOBOL 准随机生成器变体的 cuRAND 结果完全相同的序列。

下面概述了每种生成器类型的顺序参数行为差异

XORWOW 伪随机生成器#

  • NVPL_RAND_ORDERING_PSEUDO_DEFAULT 顺序与 NVPL_RAND_ORDERING_PSEUDO_FAST 相同。

  • NVPL_RAND_ORDERING_STRICT - 所有结果都在单个子序列中生成。偏移量为 n 的结果来自子序列中的位置 n

  • NVPL_RAND_ORDERING_PSEUDO_FAST - 要使用 num_threads 个线程生成 num_size 个随机数,偏移量为 n,每个线程 tid 在子序列 (tid + n) % num_threads 中生成 (num_size / num_threads) 个数。

  • NVPL_RAND_ORDERING_CURAND_LEGACY - 偏移量为 n 的结果来自原始 XORWOW 序列中的位置 \((n \% 4096) * 2^{67} + [ n / 4096]\)

MRG32k3a 伪随机生成器#

  • NVPL_RAND_ORDERING_PSEUDO_DEFAULT 顺序与 NVPL_RAND_ORDERING_PSEUDO_FAST 相同。

  • NVPL_RAND_ORDERING_STRICT - 所有结果都在单个子序列中生成。偏移量为 n 的结果来自子序列中的位置 n

  • NVPL_RAND_ORDERING_PSEUDO_FAST - 要使用 num_threads 个线程生成 num_size 个随机数,偏移量为 n,每个线程 tid 在子序列 (tid + n) % num_threads 中生成 (num_size / num_threads) 个数。

  • NVPL_RAND_ORDERING_CURAND_LEGACY - 偏移量为 n 的结果来自原始 MRG32k3a 序列中的位置 \((n \% 4096) * 2^{76} + [ n / 4096]\)。 请注意,MRG32k3a 的后续样本之间的步幅与 XORWOW 不同。

Philox_4x32_10 伪随机生成器#

  • NVPL_RAND_ORDERING_PSEUDO_DEFAULT 顺序与 NVPL_RAND_ORDERING_PSEUDO_FAST 相同。

  • NVPL_RAND_ORDERING_STRICT - 所有结果都在单个子序列中生成。偏移量为 n 的结果来自子序列中的位置 n

  • NVPL_RAND_ORDERING_PSEUDO_FAST - 要使用 num_threads 个线程生成 num_size 个随机数,偏移量为 n,每个线程 tid 在子序列 (tid + n) % num_threads 中生成 (num_size / num_threads) 个数。

  • NVPL_RAND_ORDERING_CURAND_LEGACY - 每个线程都基于基本算法的不同参数集生成不同的序列。总共有 65535 个不同的序列。一个序列中的每四个值之后是下一个序列中的四个值。

PCG 伪随机生成器#

  • NVPL_RAND_ORDERING_PSEUDO_DEFAULT 顺序与 NVPL_RAND_ORDERING_PSEUDO_FAST 相同。

  • NVPL_RAND_ORDERING_STRICT - 所有结果都在单个子序列中生成。偏移量为 n 的结果来自子序列中的位置 n

  • NVPL_RAND_ORDERING_PSEUDO_FAST - 要使用 num_threads 个线程生成 num_size 个随机数,偏移量为 n,每个线程 tid 在子序列 (tid + n) % num_threads 中生成 (num_size / num_threads) 个数。

注意

PCG 生成器不支持 NVPL_RAND_ORDERING_CURAND_LEGACY,因为 cuRAND 中没有该生成器。

32 位和 64 位 SOBOL 和 Scrambled SOBOL 准随机生成器#

  • NVPL_RAND_ORDERING_QUASI_DEFAULT - 当在 d 维度中生成 n 个结果时,输出将由来自第 1 维度的 n / d 个结果、来自第 2 维度的 n / d 个结果以及依此类推直到第 d 维度的结果组成。只能生成维度大小的精确倍数。