我想知道如何在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
答案 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 &
我最喜欢你实现命令行开关,类似于上面的例子。你也可以建立二进制文件。
通过修改,您无法将C字符串与==
进行比较,您需要使用strcmp
或strncmp
。对于更复杂的命令行参数解析,请查看getopt_long
。