MPI_发送到单变量目的地

问题描述 投票:0回答:1

我想向单个但可变的主机发送一条

MPI_Send
消息。我的意思是,我在编译时不知道要发送消息的主机的级别。

很自然地,我写的是以下内容:

MPI_Send(&myIntData, 1, MPI_INT, target_host, MY_MSGTAG,   MPI_COMM_WORLD);

其中

target_host
是一个整数,包含目的地的排名。

当我执行此操作时,MPI 以超时结束。如果我在发送前后都放了

printf
,则只显示之前发生的
printf
,这意味着我的程序卡在了
MPI_Send
语句中。

例如,如果我将

target_host
更改为 1,则显示第二个
printf
并且一切正常。

那么.. MPI 不支持目标等级标识符中的变量吗?

这里有什么问题?

c mpi send
1个回答
0
投票

MPI 确实允许在排名参数中使用变量。考虑下面的例子

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

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

    int rank = 0;
    int comm_size = 0;

    MPI_Init(&argc, &argv);

    MPI_Comm_size(MPI_COMM_WORLD, &comm_size);
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);

    printf("Rank %d starting\n", rank);
    unsigned int i;

    if(rank == 0){

        for(i = 1; i < comm_size; i++){

            char myString[] = "STRING";
            int len = strlen(myString);
            printf("Sending to %d\n", i);
            MPI_Send(myString, len, MPI_CHAR, i, 0, MPI_COMM_WORLD);

        }
    }
    else{
        char rbuf[4096];            
        MPI_Recv((void*)rbuf, 4096, MPI_CHAR, MPI_ANY_SOURCE, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
        printf("[%d] Got %s in Recv\n", rank, rbuf);
    }


    MPI_Finalize();

}

使用

mpicc -o my_program example.c
进行编译,并确保使用
mpiexec -n 2 my_program
或大于 2 的数字
-n
参数(即要使用的进程数)运行程序。在您的情况下,您需要将主机作为消息发送到排名 0。然后,在等级 0 中,您将需要一个循环来从每个等级接收。类似于下面的内容

if(rank != 0){
    MPI_Send(host, host_msg_len, MPI_CHAR, 0, 0, MPI_COMM_WORLD);
}
else{
    for(i = 1; i < comm_size; i++){
        char rbuf[4096];            
        MPI_Recv((void*)rbuf, 4096, MPI_CHAR, i, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);

        if(strcmp(rbuf, target_host) == 0){
            target_rank = i;
            break;
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.