MPI C 如何访问其他级别的 struct/variables

MPI C how to access struct/variables of other rank

所以如果我有 C 代码 运行 MPI 和这样的结构:

typedef struct Node{
    int succ;
    int pred;
    int has_token;
    char state;
}node;

一个rank可以访问另一个rank节点吗?
例如我有:

//What i want:
if(rank==0){
    //so rank 0.state               lets say i want rank 2.state
    if(currentRankNode.state=='I' && someOtherRankNode.state=='S'){
        //do_smth
    }
}

问题是,我应该用什么替换 someOtherRankNode 以获得例如等级 2 的节点和之后的状态?

根据您在这里获得的少量信息,我认为您要问的是如何查看另一个 MPI 进程的内存(即使用 rank == 2 查看进程的当前状态)。

默认情况下,MPI进程的内存空间被操作系统完全隔离,即使运行在同一台物理机器上。您必须通过发送和接收消息来同步状态知识。在较新版本的 MPI 中,您可以使用 MPI Windows: https://www.mpich.org/static/docs/v3.2/www3/MPI_Win_allocate_shared.html 等功能,尽管这有点复杂。

不,至少你需要一个像MPI_SendMPI_BCastMPI_AllGather这样的通信程序来发送someOtherRankNode.staterank == 0。例如:

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

int main(void)
{
    char rank_0_state;
    char rank_1_state;

    MPI_Init(NULL, NULL);
    int world_size;
    MPI_Comm_size(MPI_COMM_WORLD, &world_size);

    if (world_size != 2)
        return 1;

    int rank;
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);

    if (rank == 0)
        rank_0_state = 'I';

    if (rank == 1)
        rank_1_state = 'S';


    if (rank == 0) {
        MPI_Status status;
        MPI_Recv(&rank_1_state, 1, MPI_BYTE, 1, 0, MPI_COMM_WORLD, &status);
    }
    if (rank == 1)
        MPI_Send(&rank_1_state, 1, MPI_BYTE, 0, 0, MPI_COMM_WORLD);

    if (rank == 0) {
        if (rank_0_state == 'I' && rank_1_state == 'S') {
            printf("I am rank 0 receiving the right value from rank 1\n");
        }
    }

    MPI_Finalize();

    return 0;
}

尝试使用 MPI_Type_struct 跨进程正确发送该结构。