如何检测我的应用程序是不是由 MS MPI mpiexec 启动?

Posted

技术标签:

【中文标题】如何检测我的应用程序是不是由 MS MPI mpiexec 启动?【英文标题】:How can I detect if my application is started by MS MPI mpiexec?如何检测我的应用程序是否由 MS MPI mpiexec 启动? 【发布时间】:2018-11-20 10:38:32 【问题描述】:

我的应用程序是顺序的,我想让它并行。因此我想检查我是否在 MPI 环境中或不适应并行处理。

【问题讨论】:

可能最简单的检查方法是使用 MPI_Comm_size... 大小告诉您内核的数量。但是,在不知道您使用什么语言的情况下,我无法更具体地了解语法。 但是要调用任何 MPI 方法,我们需要先调用 MPI_Init()。但我想知道是否已经设置了 MPI 环境。 【参考方案1】:

顺序应用是并行应用的一种特殊情况(当进程数=1时),所以你应该不需要任何特殊的适配。只需致电MPI_Init 并按照 cmets 中的建议确定通信器的大小。

一些 MPI 实现(例如,Open MPI 和 MS MPI)允许您直接执行程序,而无需 mpiexec,并且对 MPI_Init 的调用仍然不会失败,因此您的并行应用程序可以同样好地用于连载。

要实际检测您的应用程序是否真的使用mpiexec 执行,您通常可以检查环境变量。我使用以下程序打印了我的 Windows 应用程序的环境变量(链接到 MS MPI v10):

#include <mpi.h>
#include <stdio.h>
#include <windows.h>

int main (void)

    for (const char* envs = GetEnvironmentStrings();
         *envs != 0;
         envs += strlen(envs) + 1)
    
        printf("%s\n", envs);
    

    return 0;

当我使用mpiexec -n 1 执行应用程序时,我看到在不使用启动器时已经存在的环境变量之上设置了几个新环境变量:

PMI_APPNUM=0
PMI_DOMAIN=a96606eb-0e17-46fc-ba6e-d8ca3f462bc6
PMI_HOST=localhost
PMI_KVS=4d648866-1723-4f0d-b2dc-450eae52e410
PMI_NODE_IDS=smp_region_5540
PMI_PORT=03fd2819-719a-43a0-ad9a-d8b9fb0443fd
PMI_RANK=0
PMI_RANK_AFFINITIES=affinity_region_5540
PMI_SIZE=1
PMI_SMPD_ID=1
PMI_SMPD_KEY=0
PMI_SPAWN=0

因此,这些环境变量的存在可能表明使用了 MS MPI。同样,OMPI_COMM_WORLD_SIZE 的存在表明使用了 Open MPI。等等。

【讨论】:

以上是关于如何检测我的应用程序是不是由 MS MPI mpiexec 启动?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 MS HPC Server 2008 R2 的 MPI 堆栈成功编译 mpi4py?

MS MPI 没有包含的文件夹

如果我不将 MPI_Isend 与 MPI_Wait 配对,我的程序是不是需要增加内存量?

如何从 C 中使用 MPI_Scatter 和 MPI_Gather?

如何使用 MPI 广播提升向量?

ms mpi 错误:无法分配启动块