在Windows上使用MPI_SEND和MPI_RECV时出错

ezykj2lf  于 2023-01-27  发布在  Windows
关注(0)|答案(2)|浏览(261)

我正在跟踪文档中的源代码,但当我尝试使用Open MPI库中的MPI_Send()MPI_Recv()时遇到错误。我在Google上搜索并阅读了此站点中的一些线程,但我无法找到解决方案来解决我的错误。这是我的错误:

mca_oob_tcp_msg_recv: readv faled : Unknown error (108)

下面是详细信息图像:

这是我要用的代码

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

int main(int argc, char **argv) {
int rank, size, mesg, tag = 123;
MPI_Status status;

MPI_Init(&argv, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &size);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
if (size < 2) {
    printf("Need at least 2 processes!\n");
} else if (rank == 0) {
    mesg = 11;
    MPI_Send(&mesg,1,MPI_INT,1,tag,MPI_COMM_WORLD);
    MPI_Recv(&mesg,1,MPI_INT,1,tag,MPI_COMM_WORLD,&status);
    printf("Rank 0 received %d from rank 1\n",mesg);
} else if (rank == 1) {
    MPI_Recv(&mesg,1,MPI_INT,0,tag,MPI_COMM_WORLD,&status);
    printf("Rank 1 received %d from rank 0/n",mesg);
    mesg = 42;
    MPI_Send(&mesg,1,MPI_INT,0,tag,MPI_COMM_WORLD);
}
MPI_Finalize();
return 0;
 }

我注解了所有的MPI_Send()MPI_Recv(),我的程序可以运行。另一方面,我注解了MPI_Send()MPI_Recv(),我仍然得到那个错误。所以我认为问题出在MPI_Send()MPI_Recv()函数上。
P.S.:我正在Windows 8.1操作系统上使用Open MPI v1.6。

juud5qan

juud5qan1#

您向MPI_Init传递了错误的参数(两次argv,而不是argc和argv各一次)。我认为发送和接收实际上看起来很好。但是在您的一个打印文件中有一个打字错误,使用/n而不是\n
以下是对我有效的方法(不过在MacOSX上):

int main(int argc, char **argv) {
int rank, size, mesg, tag = 123;
MPI_Status status;

MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &size);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
if (size < 2) {
    printf("Need at least 2 processes!\n");
} else if (rank == 0) {
    mesg = 11;
    MPI_Send(&mesg,1,MPI_INT,1,tag,MPI_COMM_WORLD);
    MPI_Recv(&mesg,1,MPI_INT,1,tag,MPI_COMM_WORLD,&status);
    printf("Rank 0 received %d from rank 1\n",mesg);
} else if (rank == 1) {
    MPI_Recv(&mesg,1,MPI_INT,0,tag,MPI_COMM_WORLD,&status);
    printf("Rank 1 received %d from rank 0\n",mesg);
    mesg = 42;
    MPI_Send(&mesg,1,MPI_INT,0,tag,MPI_COMM_WORLD);
}
MPI_Finalize();
return 0;
 }

如果这不起作用,我猜您的操作系统不允许进程通过OpenMPI选择的方法相互通信。

xqnpmsa8

xqnpmsa82#

在MPI_Recv的两个位置设置MPI_STATUS_IGNORED而不是&status

相关问题