我对群集编程很陌生,并且很难找到解决方法。我在使用bash集群和使用OpenMPI的SGE上。
我有一个任务,我想运行我的过程的几个变体,唯一的区别是不同的配置,我将为我的程序分配更多的资源。举个例子:
#$ -pe openmpi $process_num
我在这里将process_num
进程分配到我的工作环境中。我希望我的环境能够改变,例如:我想为process_num
尝试1,2和3,换句话说,我有3种变化。我想提交一个包含如下简单循环的sh
作业:
# ... other environment variable definitions
for process_num in 1 2 3
do
# ... some other environment variable definitions
#$ -pe openmpi $process_num
mpirun ./my_prog -npernode 1
done
换句话说,一个包装好的' job将执行我的所有变体并考虑资源分配/扩展。我想这样我就可以为每次迭代的所有3种工作变量分配不同的资源。我想问一下这是否可行,即工作环境是否能够按照描述的方式扩展,还是我必须提交3个单独的工作?
当然,如果答案是肯定的 - 提交单独的工作,那么当我想要尝试50种这样的配置时会发生什么?然后,提交50个(或大量)单独工作的最佳实践方法是什么?
不幸的是,由于群集是共享资源,我无法按照自己的意愿进行实验。
答案 0 :(得分:0)
作业由其使用的资源“定义”。如果要测试三种资源配置,则需要提交三个作业。
另一个选项是分配最大配置并按顺序运行三个作业。这就是问题中的脚本所暗示的内容。但是你会通过分配而不是使用CPU来浪费集群资源。
最佳做法是尽可能充分利用您分配的所有资源。
通过前端节点上的脚本轻松提交多个作业。我相信SGE使用qsub
,所以它会像parallel "qsub -pe openmpi {} -v CPUS={} -l n_cpus={} test-job.sh" ::: 1 2 3
。 qsub的确切语法在很大程度上取决于您的环境。在test-job.sh
中,您将使用$CPUS
正确启动您的mpi作业(不确定是否需要这样,可能正确初始化的SGE并行环境-pe
就足够了)。我正在使用parallel
而不是bash循环只是因为更好更紧凑的语法,它没有什么区别。