MPI_SEND 在 MPI_BARRIER 之后停止工作

2024-06-22

我正在 C/MPI 中构建一个分布式 Web 服务器,在我的代码中的第一个 MPI_BARRIER 之后,点对点通信似乎完全停止工作。标准 C 代码在屏障之后工作,因此我知道每个线程都可以通过屏障。点对点通信在障碍物之前也能正常工作。但是,当我将在屏障之前的行工作的相同代码复制粘贴到屏障之后的行时,它完全停止工作。 SEND 将永远等待。当我尝试使用 ISEND 时,它会通过线路,但从未收到消息。我经常在谷歌上搜索这个问题,每个对 MPI_BARRIER 有问题的人都被告知屏障工作正常,而他们的代码是错误的,但我一生都无法弄清楚为什么我的代码是错误的。什么可能导致这种行为?

这是一个演示这一点的示例程序:

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

int main(int argc, char *argv[])
{
  int procID;
  int val;
  MPI_Status status;

  MPI_Init(&argc, &argv);
  MPI_Comm_rank(MPI_COMM_WORLD, &procID);
  MPI_Barrier(MPI_COMM_WORLD);

  if (procID == 0)
  {
    val = 4;
    printf("Before send\n");
    MPI_Send(&val, 1, MPI_INT, 1, 4, MPI_COMM_WORLD);
    printf("after send\n");
  }

  if (procID == 1)
  {
    val = 1;
    printf("before: val = %d\n", val);
    MPI_Recv(&val, 1, MPI_INT, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &status);
    printf("after: val = %d\n", val);
  }

  MPI_Finalize();
  return 0;
}

移动两人if屏障之前的语句会导致该程序正确运行。

EDIT- 看来第一次通信,无论类型如何,都能正常工作,而以后的所有通信都会失败。这比我一开始的想法要普遍得多。无论第一次通信是障碍还是其他消息,未来的通信都无法正常工作。


当 Open MPI 使用 TCP/IP 进行通信时,它有一个已知的功能:它尝试使用all配置的网络接口处于“UP”状态。如果无法通过所有这些接口访问某些其他节点,这就会出现问题。这是 Open MPI 采用的贪婪通信优化的一部分,有时(就像您的情况一样)会导致问题。

看来至少第二个节点有多个已启动的接口,并且这一事实是在协商阶段引入到第一个节点的:

  • 一个配置为 128.2.100.167
  • 一台配置了 192.168.109.1(您的机器上是否运行隧道或 Xen?)

障碍通信发生在第一个网络上,然后是下一个网络上MPI_Send尝试通过第二个网络发送到第二个地址,该网络显然没有连接所有节点。

最简单的解决方案是告诉 Openmp 仅使用连接节点的网络。您可以使用以下 MCA 参数告诉它这样做:

--mca btl_tcp_if_include 128.2.100.0/24

(或者无论您的通信网络是什么)

如果所有计算机上的网络接口列表都相同,您还可以指定网络接口列表,例如

--mca btl_tcp_if_include eth0

或者您可以告诉 Open MPI 专门排除某些接口(但如果这样做,您必须始终告诉它排除环回“lo”):

--mca btl_tcp_if_exclude lo,virt0

希望这对您和许多其他在 SO 似乎遇到相同问题的人有所帮助。看起来最近几乎所有 Linux 发行版都开始默认提供各种网络接口,这可能会导致 Open MPI 出现问题。

附:请将这些节点置于防火墙后面!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MPI_SEND 在 MPI_BARRIER 之后停止工作 的相关文章

  • “sites-enabled”和“sites-available”目录之间有什么区别? [关闭]

    Closed 这个问题是与编程或软件开发无关 help closed questions 目前不接受答案 Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的
  • 用作 MAMP 起始页 URL 的 index.* 文件在哪里?

    我试图了解 MAMP 如何管理 Apache Web 服务器 但我找不到index 用作 MAMP 起始页的文件 虚拟主机配置 httpd vhosts conf 不包括在内并且Applications MAMP htdocs仅包含我自己的
  • Tomcat 8 上的 PHP

    我找到了很多如何让 PHP 在 Tomcat 上运行的指南 但都是以前的版本 我尝试了所有这些 但我所能显示的只是一个空白页面 并且代码仍然没有被触发 我知道 Tomcat 是为 Java 应用程序而不是 PHP 构建的 但我需要找到一种使
  • 如何在MPI中传递2D数组并使用C语言创建动态标签值?

    我是 MPI 编程新手 我有一个 8 x 10 数组 需要用它来并行查找每行的总和 在等级 0 进程 0 中 它将使用 2 维数组生成 8 x 10 矩阵 然后我会用tagnumber 作为数组的第一个索引值 行号 这样 我可以使用唯一的缓
  • 如何查找分布式dask中任务失败的原因?

    我正在开发一个分布式计算系统dask distributed 我通过以下方式提交给它的任务Executor map功能有时会失败 而其他看起来相同的功能却可以成功运行 该框架是否提供了诊断问题的方法 update我所说的失败是指增加 Bok
  • Tomcat如何通过IP地址限制访问?

    有谁知道Tomcat是否可以通过IP地址限制对某些应用程序的访问 例如Apache的 htaccess 你添加一个Valve to the Context in context xml 具体来说 org apache catalina va
  • 是否存在用于开放 xml Excel 编辑的良好包装类和/或库?

    我正在寻找一个不错的库 用于在我们的 Windows 服务器上编辑和 或生成 Excel 文档 我觉得 open xml sdk 可能是可行的方法 但对我来说 学习曲线似乎很陡峭 而且我们的开发时间有限 我认为编辑 Excel 文档不应该那
  • 通过 mpi 发送 c++ std::vector

    我知道存储一个std vector
  • 如何重定向到 warp 中带有尾部斜杠的 URL?

    我在用warp https crates io crates warp提供静态文件目录 不幸的是 当我在路径中添加尾部斜杠时 只能解析这些静态文件中使用的相对链接 这是我用来服务目录的代码 let route warp path segme
  • java:如何设置全局线程ID?

    是否有可能为线程设置唯一ID 在分布式系统中 线程是在许多不同的机器上创建的 例如通过 RMI 我需要它来创建日志消息 根据我的研究 我知道可以使用 log4j mdc ndc 来完成 但只能在单线程中完成 我的问题是 在创建线程时必须设置
  • “ab”或“httperf”哪个更适合检查网站的性能?

    到目前为止我知道 ab 和 httperf 两者都可以检查网站的性能 这个比那个好吗 嗯 这确实有点取决于您想要检查的内容 但我自己总是使用 httperf 关键区别在于 httperf 尝试以给定速度发送连续的请求流 无论请求是否得到答复
  • MPI 中的等级和进程有什么区别?

    MPI 中的等级和进程有什么区别 Here http www netlib org utk papers mpi book mpi book html是我学习所有 MPI 的资源 您可能会发现它很有用 至于你的问题 流程是正在运行的程序的实
  • 一个好的多线程 python 网络服务器?

    我正在寻找一个多线程而不是多进程的 python Web 服务器 如 apache 的 mod python 的情况 我希望它是多线程的 因为我希望有一个内存对象缓存供各种 http 线程使用 我的网络服务器做了很多昂贵的事情并计算了一些大
  • 如何使用分布式 Dask 和预先训练的 Keras 模型进行模型预测?

    我正在加载预训练的 keras 模型 然后尝试使用 dask 并行化大量输入数据 不幸的是 我遇到了一些与我如何创建 dask 数组有关的问题 任何指导将不胜感激 Setup 首先我从这个仓库克隆https github com sanch
  • Node.JS Web 服务器中的安全性

    所以 我正在学习 Node JS 到目前为止我很喜欢它 我已经有几个项目在工作了 我想我可以在其中使用nodejs 不过 我担心安全问题 如果我使用 Node JS http 模块编写自定义 Web 服务器 我是否可能非常容易受到攻击 Ap
  • 如何在 Android 上运行我的 Node.js 项目?

    我的 android 平板电脑上有一个可用的 php 服务器 所以我希望它也可以以某种方式运行 nodejs 源代码可以在github上找到 也可以在linux上构建 但我不太明白如何构建它 提前致谢 网站上缺少构建说明 下载它 wget
  • Hazelcast 分布式锁与 iMap

    我们目前使用 Hazelcast 3 1 5 我有一个简单的分布式锁定机制 应该可以跨多个 JVM 节点提供线程安全性 代码非常简单 private static HazelcastInstance hInst getHazelcastIn
  • .NET 的 BLOB 分布式存储?

    我正在寻找一个经过相当好的测试的库 服务器来存储持久的分布式哈希表 我对使用基于 SQL 的解决方案犹豫不决 因为数据是高度面向文档的 由数百万个约 64KB 的 blob 组成 只有一个索引 由所述 BLOB 的哈希计算 并且需要能够进行
  • 在我的 php 网络服务器内副本中启用 mysqli

    正如这里所讨论的 mysqli 直接运行时有效 但通过 js ajax 运行时无效 https stackoverflow com questions 31523601 mysqli works when run directly but
  • openmpi 忽略错误:无法识别 mca 接口

    今天早上 我升级了 gfortran 从 4 7 到 6 1 0 和 OpenMPI 从 1 10 到 2 0 1 编译器 我写了这个简单的程序 program main use mpi f08 implicit none

随机推荐