前面的例子是用集群计算来处理大数据量的运算,在每个子任务中只处理部分数据,从而更充分地利用有限的内存。还有一种情况,是需要完成大运算量的任务,此时也可以使用集群计算,将运算分配到多个服务器中执行,在主程序中汇总结果。
如下面的子程序CalcPi.dfx:
|
A |
B |
C |
1 |
1000000 |
0 |
>output@t("Task "+ string(arg1)+ " start...") |
2 |
for A1 |
=rand() |
=rand() |
3 |
|
=B2*B2+C2*C2 |
|
4 |
|
if B3<1 |
>B1=B1+1 |
5 |
>output@t("Task "+ string(arg1)+ " finish.") |
return B1 |
|
参数arg1用来记录任务序号:
这是一个用概率来估算圆周率π的程序。先来看下面的图:
在边长为1的正方形中有1/4个圆,正方形的面积为1,扇形的面积为π/4。那么正方形中的任意1个点落在扇形内的概率就是它们的面积比,也就是π/4。在子程序中,随机生成1,000,000个横纵坐标在[0,1)区间内的点,考察它们距原点的距离,并记录下在扇形内的点的个数,以此来估算π。
主程序如下:
|
A |
B |
1 |
[192.168.10.229:8281] |
20 |
2 |
=callx("CalcPi.dfx",to(B1);A1) |
=A2.sum()*4/(1000000d*B1) |
通过调用20次子程序,用集群计算将20,000,000个点的计算分配到服务器完成,仍然使用前面的服务器。可以在各个服务器的系统信息输出窗口中,看到任务的分配和执行情况:
如果工作总数超过了分机容纳任务总数,当前面任务分配至各个分机进程均已占满时,后面的任务需要等待有进程空闲下来再分配。此时进程出现空闲,任务就会被分配到哪个服务器,每次分配的情况是有可能变化的。各个工作的计算过程各自独立,因此后分配的工作也有可能会先完成,但是并不会影响并行计算结果。
在B2中计算出π的近似值如下,由于是用概率随机计算的,每次获得的结果均有差别: