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 中,stdin
由 mpirun
进程读取。
然后读取的数据转发到一个 MPI 任务(任务 0,除非另有明确要求),这可能涉及 orted
守护进程。
最重要的是,从转发 stdin
的MPI任务的角度来看,文件描述符零是pipe
到本地守护进程(mpirun
或 orted
),这就是 tcgetattr()
和朋友失败的原因。
注意所有其他 MPI 任务的文件描述符零指向 /dev/null
。
IIRC,SLURM
提供了一个 srun
选项(例如 direct-运行),其中 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 中,stdin
由 mpirun
进程读取。
然后读取的数据转发到一个 MPI 任务(任务 0,除非另有明确要求),这可能涉及 orted
守护进程。
最重要的是,从转发 stdin
的MPI任务的角度来看,文件描述符零是pipe
到本地守护进程(mpirun
或 orted
),这就是 tcgetattr()
和朋友失败的原因。
注意所有其他 MPI 任务的文件描述符零指向 /dev/null
。
IIRC,SLURM
提供了一个 srun
选项(例如 direct-运行),其中 stdin
是一个伪终端。