C++ 使用mpirun/mpiexec运行时检测到未使用MPI

C++ 使用mpirun/mpiexec运行时检测到未使用MPI,c++,c,c++11,mpi,C++,C,C++11,Mpi,我正在编写一个程序(C++11),可以选择使用MPI并行运行。项目使用CMake进行配置,如果找不到MPI,CMake将自动禁用MPI,并显示一条有关MPI的警告消息 然而,我担心的是一个完全合理的用例,用户在HPC集群上配置和编译程序,忘记加载MPI模块,并且没有注意到警告。然后,该用户可能会尝试运行该程序,注意未找到mpirun,包括MPI模块,但忘记重新编译。如果用户随后使用mpirun运行程序,这将起作用,但由于在编译时禁用了MPI,程序将只运行多次而不进行任何并行化。为了防止用户认为程

我正在编写一个程序(C++11),可以选择使用MPI并行运行。项目使用CMake进行配置,如果找不到MPI,CMake将自动禁用MPI,并显示一条有关MPI的警告消息

然而,我担心的是一个完全合理的用例,用户在HPC集群上配置和编译程序,忘记加载MPI模块,并且没有注意到警告。然后,该用户可能会尝试运行该程序,注意未找到
mpirun
,包括MPI模块,但忘记重新编译。如果用户随后使用
mpirun
运行程序,这将起作用,但由于在编译时禁用了MPI,程序将只运行多次而不进行任何并行化。为了防止用户认为程序正在并行运行,我想让程序在这种情况下显示一条错误消息

我的问题是:如果不使用MPI库函数(因为MPI在编译时被禁用),如何检测我的程序正在并行运行<据我所知,code>mpirun只是多次启动程序,但没有告诉启动的进程它们是并行运行的

我曾考虑让程序编写一些测试文件,然后检查该文件是否已经存在,但除了由于并发性问题而很难做到这一点之外,还不能保证
mpirun
甚至会在共享文件系统的节点上启动各种进程

我还考虑过使用系统变量在两个进程之间进行通信,但据我所知,没有独立于系统的方法来实现这一点(同样,这可能会导致并发问题,因为无法协调不同进程之间的系统调用)


因此,目前我的想法已经没有了,我非常感谢任何可能帮助我实现这一目标的建议。首选的解决方案应该是独立于操作系统的,尽管只有UNIX的解决方案已经非常有用。

基本上,您希望在非MPI代码路径中运行一个检测,检测您是否正在由
mpirun
等运行。还有一个非常类似的问题:这已经提供了一个不可移植的解决方案

检查mpirun设置的环境变量。例如,见:

作为另一个选项,您可以获取和,并将其与已知MPI启动器二进制文件列表进行比较,如
orted、slurmstepd、hydra???
1。不幸的是,这一切都是不可移植的

由于MPI标准没有明确定义启动本身,因此没有标准的方法来检测它

1:只是我的记忆,请不要照字面理解


从用户体验的角度来看,我认为始终显示程序运行的清晰信息,例如:

连续运行FancySimulator。如果您将此视为mpirun的一部分,请使用FANCYSIM\u MPI=True重建FancySimuilator

与120 MPI进程并行运行FancySimulator


将“解决”问题。希望收到120条乱码消息的用户会注意到。

可以使用
ldd
命令检查程序是否链接到MPI库。例如,见。也许程序可以
ldd
自己(使用
argv[0]
)解析
mpicc的输出--show
,查看模块是否已加载。。。如果结果不兼容,程序可能会显示错误。必须有一个最干净的方法来做到这一点…只要在开头显示一个大横幅:“这是FOOBAR在串行模式下运行”。细心的用户会注意到。