我想将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排名标识符中的变量吗?
这里有什么问题?
答案 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;
}
}
}