生成器选项#
随机数生成器一旦创建,可以根据需要使用多个选项进行修改。
种子#
种子参数是一个 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_STRICT
或NVPL_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 维度的结果组成。只能生成维度大小的精确倍数。