默认情况下,随机数生成功能兰特
,兰迪
和randn
相比那些在CPU上一个GPU用于计算不同生成器设置。你可以改变随机数生成器的行为以产生对GPU和CPU的随机数序列的重复性。
下表总结了GPU和CPU上的客户端和工人MATLAB的默认设置®会议:
发电机 | 种子 | 普通变换 | |
---|---|---|---|
客户端CPU | “龙卷风” 要么'mt19937ar' |
0 |
“通灵塔” |
工人CPU | 'Threefry' 要么'Threefry4x64_20' |
0 |
“反转” |
GPU(客户端或工人) | 'Threefry' 要么'Threefry4x64_20' |
0 |
'BoxMuller' |
在大多数情况下,它并不重要,关于GPU默认的随机数生成器是不一样的,客户端或工人CPU的默认发电机。但是,如果你需要复制的GPU和CPU两者相同的结果,您可以设置相应的发电机。
在新鲜MATLAB会话,MATLAB生成CPU和GPU上的随机数的不同的序列。
RC =兰特(1,4)
RC = 0.8147 0.9058 0.1270 0.9134
RG =兰特(1,4,'gpuArray')
RG = 0.3640 0.5421 0.6543 0.7436
如果你需要生成的GPU和CPU两个随机数相同的序列,可以设置生成器设置相匹配。
有三种随机数生成器可在GPU算法:'Threefry'
,'Philox'
和'CombRecursive'
。所有被支持的CP万博1manbetxU。下表列出了这些发电机及其性能的算法。
关键词 | 发电机 | 多流和支流支持万博1manbetx | 全精度近似周期 |
---|---|---|---|
'Threefry' 要么'Threefry4x64_20' |
Threefry 4x64发生器20发 | 是 | 2514(2256长度为2的流258) |
'Philox' 要么'Philox4x32_10' |
Philox 4x32发生器10发 | 是 | 2193(264长度为2的流129) |
'CombRecursive' 要么'mrg32k3a' |
联合多个递归发生器 | 是 | 2191(263长度为2的流127) |
您可以使用RNG
和gpurng
设定CPU和GPU上的生成器算法和种子,分别。
SC = RNG(1,'Threefry');RC =兰特(1,4)
RC = 0.1404 0.8197 0.1073 0.4131
SG = gpurng(1,'Threefry');RG =兰特(1,4,'gpuArray')
RG = 0.1404 0.8197 0.1073 0.4131
兰特
和兰迪
现在生成客户端CPU和GPU上的随机数的相同的序列。
并行工人CPU使用相同的默认随机数生成器的类型和种子作为客户端GPU和工人GPU,如果有一个。GPU和CPU不共享相同的流。默认,兰特
和兰迪
生成数字对GPU和CPU的工人相同的序列。
这些设置是从这些客户端CPU上的不同。欲了解更多信息,请参阅在工人控制随机数流
如果你需要在每个工人产生不同的随机数,就可以改变发电机的设置。在这个例子中,每个工人上创建其GPU和CPU相同的序列,但不同的序列上每个工人生成。
P = parpool(2);SPMDRNG(labindex,'Threefry');RC =兰特(1,4)gpurng(labindex,'Threefry');RG =兰特(1,4,'gpuArray')结束删除(P)
对于正态分布的随机数使用创建randn
功能,MATLAB客户机CPU,一个工人CPU和GPU上产生不同的结果。均匀随机数的成正态分布的随机数的转换是由控制NormalTransform
设置。您也可以利用图形处理单元控制该parallel.gpu.RandStream
。
在客户端CPU,默认'NormalTransform'
设置“通灵塔”
。一个工人CPU,默认设置是“反转”
。
除另有规定外,GPU的代码使用'BoxMuller'
变换为'Threefry'
和'Philox'
发电机和“反转”
变换为'CombRecursive'
发电机。
您可以设置CPU在同一发电机和变换和GPU获得相同的randn
序列。唯一的变换既支持对CPU和GPU是万博1manbetx“反转”
转变。
SC = RandStream('Threefry','NormalTransform',“反转”,'种子',1);RandStream.setGlobalStream(SC)SG = parallel.gpu.RandStream('Threefry','NormalTransform',“反转”,'种子',1);parallel.gpu.RandStream.setGlobalStream(SG);RC = randn(1,4)
RC = -1.0783 0.9144 -1.2412 -0.2196
RG = randn(1,4,'gpuArray')
RG = -1.0783 0.9144 -1.2412 -0.2196
RandStream
|gpurng
|parallel.gpu.RandStream
|RNG