MPI_Send到单个变量目标

时间:2015-03-28 21:18:46

标签: c mpi send

我想将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支持destintation排名标识符中的变量吗?

这里有什么问题?

1 个答案:

答案 0 :(得分:0)

MPI确实允许在rank参数中使用变量。请考虑以下示例

#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参数运行程序-n或大于2的数字(这是要使用的进程数)。在您的情况下,您需要执行发送以将主机排名为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;
        }
    }
}