10.2.3用集群计算处理大运算量任务

前面的例子是用集群计算来处理大数据量的运算,在每个子任务中只处理部分数据,从而更充分地利用有限的内存。还有一种情况,是需要完成大运算量的任务,此时也可以使用集群计算,将运算分配到多个服务器中执行,在主程序中汇总结果。

如下面的子程序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中计算出π的近似值如下,由于是用概率随机计算的,每次获得的结果均有差别: