缺省情况下,随机数生成函数兰德
,兰迪
,randn
在GPU上使用不同的生成器设置来进行计算。您可以改变随机数生成器的行为,以在GPU和CPU上生成可重复的随机数序列。
下表总结了客户端和worker MATLAB上的GPU和CPU的默认设置®届:
发电机 | 种子 | 正常的变换 | |
---|---|---|---|
客户端CPU | “旋风” 或“mt19937ar” |
0 |
“神” |
工人CPU | “Threefry” 或“Threefry4x64_20” |
0 |
“反转” |
GPU(在客户端或worker上) | “Threefry” 或“Threefry4x64_20” |
0 |
“BoxMuller” |
在大多数情况下,GPU上的默认随机数生成器与客户端或worker 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”
.CPU支持所有功金宝app能。下表列出了这些生成器的算法及其属性。
关键字 | 发电机 | 支持多流和子流金宝app | 全精度的近似周期 |
---|---|---|---|
“Threefry” 或“Threefry4x64_20” |
三联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和worker CPU上生成相同的数字序列。
与客户端CPU设置不一致。有关更多信息,请参见控制工人上的随机数流
如果您需要在每个worker上生成不同的随机数,您可以更改生成器设置。在这个例子中,每个worker在其GPU和CPU上创建相同的序列,但在每个worker上生成不同的序列。
p = parpool (2);spmdrng (labindex“Threefry”);rrc = rand(1,4) gpurng(labindex,)“Threefry”);Rg =兰德(1,4,“gpuArray”)结束删除(p)
为正态分布随机数创建randn
函数时,MATLAB在客户端CPU、工作CPU和GPU上产生不同的结果。均匀随机数转化为正态分布随机数是由NormalTransform
设置。你可以在GPU上使用parallel.gpu.RandStream
.
在客户端CPU上,默认“NormalTransform”
设置是“神”
.在worker CPU上,默认设置为“反转”
.
除非另有说明,GPU代码使用“BoxMuller”
变换的“Threefry”
和“Philox”
发电机和“反转”
变换的“CombRecursive”
发电机。
你可以在CPU和GPU上设置相同的生成器和转换来获得相同的效果randn
序列。CPU和GPU都支持的唯一转换是金宝app“反转”
变换。
sc = RandStream (“Threefry”,“NormalTransform”,“反转”,“种子”1);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
gpurng
|parallel.gpu.RandStream
|RandStream
|rng