Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从已经在SLURM上使用srun启动的fortran代码中运行并行程序?_Fortran_Mpi_Hpc - Fatal编程技术网

如何从已经在SLURM上使用srun启动的fortran代码中运行并行程序?

如何从已经在SLURM上使用srun启动的fortran代码中运行并行程序?,fortran,mpi,hpc,Fortran,Mpi,Hpc,我认为我的问题很具体,很有针对性,在其他任何地方都找不到答案 我有一个Fortran并行代码(使用MPI),我希望每个处理器上都有一个子程序,在运行时调用另一个(原则上是串行)程序。我使用EXECUTE\u命令行执行此操作。现在,我调用的另一个代码也是并行的,不可能生成没有MPI的纯串行版本。在我的SLURM文件中,集群的设置使得我必须使用srun,所以 srun./mycodeoutput.out 调用我的代码。但是,在第三方代码中,指定核心数量的最简单方法是使用提供的启动器,它本身使用mpi

我认为我的问题很具体,很有针对性,在其他任何地方都找不到答案

我有一个Fortran并行代码(使用MPI),我希望每个处理器上都有一个子程序,在运行时调用另一个(原则上是串行)程序。我使用
EXECUTE\u命令行
执行此操作。现在,我调用的另一个代码也是并行的,不可能生成没有MPI的纯串行版本。在我的SLURM文件中,集群的设置使得我必须使用srun,所以
srun./mycodeoutput.out
调用我的代码。但是,在第三方代码中,指定核心数量的最简单方法是使用提供的启动器,它本身使用mpirun来启动正确数量的节点

原则上,可以在不运行mpirun的情况下运行第三方代码,在这种情况下,应该启动“串行”版本(并行版本,但在单核上)。然而,由于我的代码已经在使用srun运行,这似乎触发了第三方软件的并行版本在多个处理器上运行,这破坏了我正在尝试的操作。如果我使用调用mpirun的普通启动器来调用第三方代码,那么一切都会挂起,因为mpirun正在等待srun的第一个实例完成,它永远不会完成

是否有任何方法可以指定第三方代码(在不调用mpirun的情况下没有明确指定此项的标志)在单个处理器上运行?也许我可以设置一个环境变量,或者使用
EXECUTE\u COMMAND\u LINE
的一种方法来指定要在其上运行命令的内核数?或者甚至是一种使多个mpirun命令交互以防止彼此运行的方法


我什么都用英特尔编译器和MPI版本。

一位同事找到了一种方法,可以为任何有困难的人做到这一点:

call execute_command_line("bash -lc 'env -i PATH=/usr/bin/:/bin mpirun -n 2 ./bin/slave &> slave.out &'", wait=.false.)
从调用fortran代码中执行