我有一个c ++程序,我使用
从命令行输入两个双打作为输入int main(int argc, char *argv[]){
double a,b;
a = atof(argv[1]);
b = atof(argv[2]);
further code.....
我使用qsub
实用程序在集群上运行代码,我有一个名为'jobsub.sh`的bash脚本来提交看起来像这样的作业
#!/bin/csh -f
hostname
cd /home/roy/codes/3D # change directory first -- replace Mysubdir
set startdir = `pwd` # remember the directory we're in
if( ! -d /scratch/$USER ) then
mkdir /scratch/$USER # create scratch directory
endif # if it does not exist
#cp infile12 /scratch/$USER # copy input file to scratch directory
cd /scratch/$USER # change to scratch directory
#rm *.*
$HOME/codes/3D/autoA100.out 2.1 2.2 # run a program
cp * $startdir # copy outputfiles back to where we started
在终端我做qsub jobsub.sh
但是,我想在不同的内核上并行运行a
和b
的不同值的相同可执行文件。是否可以在bash脚本中编写for循环以便我可以执行
像,
for i=1;i<=10;i++ {
$HOME/codes/3D/autoA100.out 2+i*0.1 2+i*0.2
}
答案 0 :(得分:3)
如果您要将执行脚本提交给批处理加载器,那么就无法通过简单的循环执行您想要的执行,因为整个脚本在每个节点上运行。但是,大多数批处理程序都为用户提供了环境变量。
例如,PBS有$PBS_ARRAYID
,它指定作业运行时的唯一ID。因此,您的脚本可以具有:,而不是使用循环
a=$(echo "2+($PBS_ARRAYID+1)*0.1" | bc -l)
b=$(echo "2+($PBS_ARRAYID+1)*0.2" | bc -l)
$HOME/codes/3D/autoA100.out $a $b
注意我已将1
添加到$PBS_ARRAYID
上方,因为当您的循环从0
开始时,ID从1
开始。值得一提的是,虽然bash本身可以做一些算法,但它无法处理实数;这就是为什么我必须调用bc
。
答案 1 :(得分:0)
您始终可以在后台运行作业(在这种情况下,shell将继续执行下一条指令)
MY_PIDS=
for i in 1 2 3 4 5 6 7 8 9 10
do
yourjob "$(a i)" "$(b i)" & # Note the ampersand (background)
MY_PIDS="$MY_PIDS "$! # Do not write the $! inside the quotes, bash will
# break (better, don't use bash but plain sh)
done
# Wait wor each job to complete and cleanup
for p in $MY_PIDS
do
wait "$p"
echo "Return code of job $p is $?"
do_cleanup_for "$p"
done
但当然你需要确保并行运行的作业不会踩到彼此的脚(比如写入同一个文件)。