我正在使用Matlab GPU计算来运行仿真。我怀疑我可能会遇到“随机数种子”重叠的问题。我的代码如下
N = 10000;
v = rand(N,1);
p = [0:0.1:1];
pA = [0:0.1:2];
[v,p,pA] = ndgrid(v,p,pA);
v = gpuArray(v);
p = gpuArray(p);
pA = gpuArray(pA);
t = 1;
bH = 0.9;
bL = 0.6;
a = 0.5;
Y = MyFunction(v,p,pA,t,bH,bL,a);
function[RA] = MyFunction(v,p,pA,t,bH,bL,a)
function[RA] = SSP1(v,p,pA)
RA = 0;
S1 = rand;
S2 = rand;
S3 = rand;
vA1 = (S1<a)*bH+(S1>=a)*bL;
vA2 = (S2<a)*bH+(S2>=a)*bL;
vA3 = (S3<a)*bH+(S3>=a)*bL;
if p<=t && pA>3*bL && pA<=3*bH
if pA>vA1+vA2+vA3
if v>=p
RA = p;
end
else
if v+vA1+vA2+vA3>=p+pA
RA = p+pA;
end
end
end
end
[RA] = gather(arrayfun(@SSP1,v,p,pA));
end
代码的想法如下:
我生成N
个随机代理,其特征是v
的值。然后,对于每个代理,我必须计算给定的数量(p,pA)
。由于我有N
个代理和(p,pA)
的许多组合,因此我想使用GPU来加快处理速度。 但是这是一件棘手的事情:
对于每个代理,为了完成我的计算,我必须生成3个额外的随机变量vA1,vA2,vA3
。根据我对GPU的理解(可能是错误的),它会同时执行这些计算,即,对于每个代理v
,它会生成3个随机变量vA1,vA2,vA3
。 GPU同时执行此N
程序。但是,我不确定代理1和代理2是否对应的vA1,vA2,vA3
可以重叠?因为这里N
可能是一百万。我要确保对于所有这些代理,用于生成其对应的vA1,vA2,vA3
的随机数种子都不会重叠;否则,我很麻烦。
有一种防止这种情况发生的方法,这是:我首先生成这些随机变量3N
的vA1,vA2,vA3
。然后,将它们放入我的GPU中。但是,这可能需要很多GPU内存,而我没有。我想当前的方法不需要太多的GPU内存,因为我正在动态生成vA1,vA2,vA3
?
您说的话不会发生。证明是,以下代码片段在hB
中生成随机值。
A=ones(100,1);
dA=gpuArray(A);
[hB] = gather(arrayfun(@applyrand,dA));
function dB=applyrand(dA)
r=rand;
dB=dA*r;
end
也就是说,您的代码的随机变量只有12个值(每个为4个,因为使用S1,S2和S3基本上是在掷硬币:]]
vA1 = (S1<0.5)*bH+(S1>=0.5)*bL;
所以
vA1
为0,bH
,bL
或bH+bL
。也许由于缺乏可变性,这使您认为您没有太多的随机性,这个问题也不是很清楚。