我想向单个但可变的主机发送一条
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 不支持目标等级标识符中的变量吗?
这里有什么问题?
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;
}
}
}