我正在编写一个程序(在C ++ 11中),可以选择使用MPI并行运行。该项目使用CMake进行配置,如果找不到MPI,CMake会自动禁用它,并显示有关它的警告消息。
但是,我担心一个非常合理的用例,即用户在HPC群集上配置和编译程序,忘记加载MPI模块,并且不会注意到警告。然后,同一个用户可能会尝试运行该程序,注意找不到mpirun
,包括MPI模块,但忘记重新编译。如果用户随后使用mpirun
运行程序,这将起作用,但程序将运行多次而不进行任何并行化,因为MPI在编译时被禁用。为了防止用户认为程序并行运行,我想在这种情况下让程序显示错误信息。
我的问题是:如何在不使用MPI库函数的情况下检测到我的程序是并行运行的(因为MPI在编译时被禁用)? mpirun
只是多次启动该程序,但据我所知,并没有告诉它启动它们并行运行的过程。
我考虑让程序编写一些测试文件,然后检查该文件是否已经存在,但除了由于并发问题而可能很难处理这一事实外,无法保证mpirun
甚至会在共享文件系统的节点上启动各种进程。
我还考虑过使用系统变量在两个进程之间进行通信,但据我所知,没有系统独立的方法可以做到这一点(同样,这可能会导致并发问题,因为无法协调各个进程之间的系统调用。)
所以目前,我已经没有想法,我非常感谢任何可能帮助我实现这一目标的建议。首选解决方案应该独立于操作系统,尽管只有UNIX的解决方案已经有很大的帮助。
答案 0 :(得分:0)
基本上,您希望检测是否在非MPI代码路径中由mpirun
等运行。有一个非常相似的问题:How can my program detect, whether it was launch via mpirun已经提出了一个非便携式解决方案。
检查由mpirun设置的环境变量。见例如: http://www.open-mpi.org/faq/?category=running#mpi-environmental-variables
作为另一种选择,您可以获取process id of the parent process及其process name并将其与已知MPI启动器二进制文件列表进行比较,例如orted,slurmstepd,hydra??
1 < / SUP>。不幸的是,关于这一切的一切都是不便携的。
由于MPI标准没有明确定义启动本身,因此无法通过标准方法对其进行检测。
1:只有从我的记忆中,请不要按字面意思取得名单。
从用户体验的角度来看,我认为总是会显示程序运行的明确信息,例如:
连续运行FancySimulator。如果您将此视为mpirun的一部分,请使用FANCYSIM_MPI = True重建FancySimuilator。
或
与120 MPI进程并行运行FancySimulator。
会&#34;解决&#34;问题。收到120条乱码消息的用户有望注意到。