并行处理依赖于SGE集群

时间:2012-05-12 01:07:24

标签: parallel-processing qsub

我正在计算集群上做一些实验。我的算法有两个步骤。第一个将其输出写入一些将在第二步使用的文件。依赖性为1到n意味着一个step2程序需要n步骤1程序的输出。我不知道该怎样做腰部集群资源也不保持头部节点繁忙。我目前的解决方案是:

提交脚本(这在头节点上运行)

for different params, p:
    run step 1 with p

sleep some time based on the an estimate of how much step 1 takes

for different params, q:
    run step 2 with q

第2步算法(这在计算节点上运行)

while files are not ready:
    sleep a few minutes
do the step 2

有没有更好的方法呢?

1 个答案:

答案 0 :(得分:4)

SGE为此提供作业依赖性和数组作业。您可以将阶段1计算提交给阵列作业,然后使用qsub -hold_jid <phase 1 job ID|name> ...将阶段2计算作为依赖作业提交。这将使阶段2作业等待,直到所有阶段1计算完成,然后它将被释放和分派。只要集群中有足够的插槽,阶段1计算就会并行运行。

在提交脚本中,按作业名称指定保留并以独特方式命名每个数组作业可能很有用。 E.g。

mkdir experiment_1; cd experiment_1
qsub -N phase1_001 -t 1-100 ./phase1
qsub -hold_jid phase1_001 -N phase2_001 ./phase2 q1
cd ..
mkdir experiment_2; cd experiment_2
qsub -N phase1_002 -t 1-42 ./phase1 parameter_file
qsub -hold_jid phase1_002 -N phase2_002 ./phase2 q2
cd ..

这将安排100次执行phase1脚本作为阵列作业phase1_001,并执行另外42次执行作为阵列作业phase1_002。如果群集上有142个插槽,则所有142个执行将并行运行。然后,在phase2作业中的所有任务完成后,将调度phase1_001脚本的一次执行,并在phase1_002作业中的所有任务完成后调度一次执行。那些可以并行运行。

对于作业$SGE_TASK_ID中的任务,阵列作业中的每个tak将获得1到100的唯一phase1_001值,对于作业phase1_002中的任务,将获得1到42的值。通过它,您可以计算p参数。