openmpi、termios 和标准输入

openmpi, termios and stdin

我有一个关于 openmpi 和标准输入文件描述符 (fd) 的问题 以及termios的使用。 ompi 程序中实际上使用的是标准 fd 吗?

有 mpirun -stdin 选项可将标准输入重定向到特定级别。我假设在幕后做了一些事情。

例如,对于 STDIN_FILENO,以下代码片段在 tcgetattr 处失败,仅适用于 mpirun(但按顺序运行)。

#include <iostream>
#include <mpi.h>
#include <termios.h>
#include <unistd.h>
#include <stdio.h>
#include <assert.h>
using namespace std;

int main(int argc, char* argv[]) {
  MPI_Status status;
  MPI_Init(&argc, &argv);

  int in = dup( STDIN_FILENO );
  struct termios org_opts, new_opts;
  res = tcgetattr( in, &org_opts);
  assert(res==0);

  MPI_Finalize( );
}    

在 Open MPI 中,stdinmpirun 进程读取。

然后读取的数据转发到一个 MPI 任务(任务 0,除非另有明确要求),这可能涉及 orted 守护进程。

最重要的是,从转发 stdin的MPI任务的角度来看,文件描述符零是pipe到本地守护进程(mpirunorted),这就是 tcgetattr() 和朋友失败的原因。

注意所有其他 MPI 任务的文件描述符零指向 /dev/null

IIRC,SLURM 提供了一个 srun 选项(例如 direct-运行),其中 stdin 是一个伪终端。