Openmpi mpmd 获取通信大小

2023-09-26C/C++开发问题
3

本文介绍了Openmpi mpmd 获取通信大小的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

问题描述

我有两个 openmpi 程序,我是这样开始的

I have two openmpi programs which I start like this

mpirun -n 4 ./prog1 : -n 2 ./prog2

现在我如何使用 MPI_Comm_size(MPI_COMM_WORLD, &size) 以便我获得大小值

Now how do I use MPI_Comm_size(MPI_COMM_WORLD, &size) such that i get size values as

prog1 size=4
prog2 size=2.

截至目前,我在两个程序中都获得了6".

As of now I get "6" in both programs.

推荐答案

这是可行的,虽然实现起来有点麻烦.其原理是根据argv[0]的值将MPI_COMM_WORLD拆分为多个通信器,其中包含可执行文件的名称.

This is doable albeit a bit cumbersome to get that. The principle is to split MPI_COMM_WORLD into communicators based on the value of argv[0], which contains the executable's name.

可能是这样的:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <mpi.h>

int main( int argc, char *argv[] ) {

    MPI_Init( &argc, &argv );

    int wRank, wSize;
    MPI_Comm_rank( MPI_COMM_WORLD, &wRank );
    MPI_Comm_size( MPI_COMM_WORLD, &wSize );

    int myLen = strlen( argv[0] ) + 1;
    int maxLen;
    // Gathering the maximum length of the executable' name
    MPI_Allreduce( &myLen, &maxLen, 1, MPI_INT, MPI_MAX, MPI_COMM_WORLD );

    // Allocating memory for all of them
    char *names = malloc( wSize * maxLen );
    // and copying my name at its place in the array
    strcpy( names + ( wRank * maxLen ), argv[0] );

    // Now collecting all executable' names
    MPI_Allgather( MPI_IN_PLACE, 0, MPI_DATATYPE_NULL,
                   names, maxLen, MPI_CHAR, MPI_COMM_WORLD );

    // With that, I can sort-out who is executing the same binary as me
    int binIdx = 0;
    while( strcmp( argv[0], names + binIdx * maxLen ) != 0 ) {
        binIdx++;
    }
    free( names );

    // Now, all processes with the same binIdx value are running the same binary
    // I can split MPI_COMM_WORLD accordingly
    MPI_Comm binComm;
    MPI_Comm_split( MPI_COMM_WORLD, binIdx, wRank, &binComm );

    int bRank, bSize;
    MPI_Comm_rank( binComm, &bRank );
    MPI_Comm_size( binComm, &bSize );

    printf( "Hello from process WORLD %d/%d running %d/%d %s binary
",
            wRank, wSize, bRank, bSize, argv[0] );

    MPI_Comm_free( &binComm );

    MPI_Finalize();

    return 0;
}

在我的机器上,我编译并运行它如下:

On my machine, I compiled and ran it as follow:

~> mpicc mpmd.c
~> cp a.out b.out
~> mpirun -n 3 ./a.out : -n 2 ./b.out
Hello from process WORLD 0/5 running 0/3 ./a.out binary
Hello from process WORLD 1/5 running 1/3 ./a.out binary
Hello from process WORLD 4/5 running 1/2 ./b.out binary
Hello from process WORLD 2/5 running 2/3 ./a.out binary
Hello from process WORLD 3/5 running 0/2 ./b.out binary

理想情况下,如果存在用于按二进制文件进行排序的相应类型,则可以通过使用 MPI_Comm_split_type() 来大大简化这一过程.不幸的是,在 3.1 MPI 标准中没有预定义这样的 MPI_COMM_TYPE_.唯一的预定义是 MPI_COMM_TYPE_SHARED 用于在运行在相同共享内存计算节点上的进程之间进行排序......太糟糕了!也许该标准的下一个版本需要考虑什么?

Ideally, this could be greatly simplified by using MPI_Comm_split_type() if the corresponding type for sorting out by binaries existed. Unfortunately, there is no such MPI_COMM_TYPE_ pre-defined in the 3.1 MPI standard. The only pre-defined one is MPI_COMM_TYPE_SHARED to sort-out between processes running on the same shared memory compute nodes... Too bad! Maybe something to consider for the next version of the standard?

这篇关于Openmpi mpmd 获取通信大小的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

The End

相关推荐

无法访问 C++ std::set 中对象的非常量成员函数
Unable to access non-const member functions of objects in C++ std::set(无法访问 C++ std::set 中对象的非常量成员函数)...
2024-08-14 C/C++开发问题
17

从 lambda 构造 std::function 参数
Constructing std::function argument from lambda(从 lambda 构造 std::function 参数)...
2024-08-14 C/C++开发问题
25

STL BigInt 类实现
STL BigInt class implementation(STL BigInt 类实现)...
2024-08-14 C/C++开发问题
3

使用 std::atomic 和 std::condition_variable 同步不可靠
Sync is unreliable using std::atomic and std::condition_variable(使用 std::atomic 和 std::condition_variable 同步不可靠)...
2024-08-14 C/C++开发问题
17

在 STL 中将列表元素移动到末尾
Move list element to the end in STL(在 STL 中将列表元素移动到末尾)...
2024-08-14 C/C++开发问题
9

为什么禁止对存储在 STL 容器中的类重载 operator&amp;()?
Why is overloading operatoramp;() prohibited for classes stored in STL containers?(为什么禁止对存储在 STL 容器中的类重载 operatoramp;()?)...
2024-08-14 C/C++开发问题
6