bash脚本中的mpirun命令与MPI代码

时间:2016-03-13 08:40:15

标签: mpi slurm

我想知道如何在bash脚本(slurm)中设置变量,并在C中的MPI程序中使用该变量,反之亦然。 例如: 在test-mpi.c中定义int i; ...... 然后在bash脚本中使用它:

if (i=o)
  mpirun --map-by ppr:1:socket ./test-mpi
if (i=1)
  mpirun --map-by ppr:1:node ./test-mpi  

实际上,我想使用ppr:1:socket执行代码的一部分,使用ppr执行另一部分代码:1:node

另外,是否有将进程映射到MPI程序中的套接字而不是在bash脚本中进行的操作?

任何建议都会受到赞赏。

编辑:

如果我以这种方式使用argc,argv是否可以:

for (count =0; count < argc; count++){
 if (argv[i] == "state1"){
  for (....)
      do something

for (count =0; count < argc; count++){
 if (argv[i] == "state2"){
  for (....)
      do something

1 个答案:

答案 0 :(得分:1)

您可以在应用程序中添加命令行标志,如:

int main(int argc, char* argv[]) {
    // argc is the number of arguments, including the executable.
    // so 2 means one argument
    // check if that argument equals "--dump-i"
    if (argc == 2 && 0 == strcmp(argv[1], "--dump-i")) {
        printf("%d", i);
        return 0;
    }
    MPI_Init(NULl, NULL);
    ...
}

在你的bash脚本中有这样的东西:

i = $(./test-mpi --dump-i)
if [ "$i" == "1" ]; then
    mpirun --map-by ppr:1:socket ./test-mpi
else
    mpirun --map-by ppr:1:node ./test-mpi  
fi

(未测试的)

但我怀疑如果你提供更多关于你真正想做的事情的详细信息,还有更好的解决方案。

修改

在slurm中并行运行多个作业步骤:

# Make sure to restrict the resources, such that 
# the entire job has enough to run both steps simultaneously.
# The ampersand launches the jobs in the background such that
# they are not executed sequentially
srun -n ... --map-by ppr:1:socket ./test-mpi --first-loop &
srun -n ... --map-by ppr:1:node ./test-mpi --second-loop &

我最喜欢你实现命令行开关,类似于上面的例子。你也可以建立二进制文件。

EDIT2

通过修改,您无法将C字符串与==进行比较,您需要使用strcmpstrncmp。对于更复杂的命令行参数解析,请查看getopt_long