【问题标题】:Error when using MPI_SEND and MPI_RECV on Windows在 Windows 上使用 MPI_SEND 和 MPI_RECV 时出错
【发布时间】:2015-09-12 23:05:48
【问题描述】:

我正在关注我的文档中的源代码,但是当我尝试使用 Open MPI 库中的 MPI_Send()MPI_Recv() 时遇到错误。 我已经在这个网站上搜索并阅读了一些主题,但我找不到解决我的错误的解决方案。 这是我的错误:

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。

【问题讨论】:

  • 尝试禁用 UAC(用户帐户控制),看看是否能解决问题。 Windows 不再支持 Open MPI,您可能想尝试其他一些 MPI 实现,例如MPICH 或 MS-MPI。
  • 您好 Hristo,我通过在注册表中更改 EnabledLUA 禁用了 UAC。然后我重新运行我的程序,我仍然得到这个错误,。

标签: windows mpi openmpi


【解决方案1】:

您将错误的参数传递给 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 选择的方法相互通信。

【讨论】:

  • 您好,感谢您的回复。正如你所说,我已经更新了我的代码,但它仍然显示这个错误。
  • 好吧,那么我想,我唯一能说的是,这似乎是合法的 MPI,至少在其他系统上也可以。
  • 嗨 haraldkl,正如你所说,问题可能出在操作系统上,我在 Linux 操作系统上尝试了这段代码,它运行良好。似乎 OpenMPI 与 Windows 8.1 不兼容。感谢您的帮助。
【解决方案2】:

在两个地方的 MPI_Recv 中设置 MPI_STATUS_IGNORED 而不是 &amp;status

【讨论】:

  • 嗨,我已经更新了这样的:MPI_Recv(MPI_STATUS_IGNORE,1,MPI_INT,1,tag,MPI_COMM_WORLD,&amp;status); 但它不起作用,我仍然得到这个错误
  • 添加MPI_STATUS_IGNORED 而不是&amp;status,而不是&amp;mesg(像这样MPI_Recv(&amp;mesg,1,MPI_INT,1,tag,MPI_COMM_WORLD,MPI_STATUS_IGNORE);)并且printf("Rank 1 received %d from rank 0/n",mesg); 中有错误。它应该像printf("Rank 1 received %d from rank 0\n",mesg);
  • 您好,感谢您的帮助。我已经更新了MPI_Recv(&amp;mesg,1,MPI_INT,0,tag,MPI_COMM_WORLD,MPI_STATUS_IGNORE);,关于printf,我的原始代码是\n,我不知道为什么当我在这里发布时,它变成了/n。正如你所说,我已经用参数进行了测试,但我仍然得到这个错误。
猜你喜欢
  • 2011-11-11
  • 1970-01-01
  • 2014-04-17
  • 2011-01-24
  • 2014-04-25
  • 2018-03-05
  • 1970-01-01
  • 2019-06-08
  • 2017-10-25
相关资源
最近更新 更多