MPI_Isend 和 MPI_Irecv 似乎导致死锁

2024-03-08

我在 MPI 中使用非阻塞通信在进程之间发送各种消息。然而,我似乎陷入了僵局。我用过PADB(see here http://padb.pittman.org.uk/)查看消息队列并得到以下输出:

1:msg12: Operation 1 (pending_receive) status 0 (pending)
1:msg12: Rank local 4 global 4
1:msg12: Size desired 4
1:msg12: tag_wild 0
1:msg12: Tag desired 16
1:msg12: system_buffer 0
1:msg12: Buffer 0xcaad32c
1:msg12: 'Receive: 0xcac3c80'
1:msg12: 'Data: 4 * MPI_FLOAT'
--
1:msg32: Operation 0 (pending_send) status 2 (complete)
1:msg32: Rank local 4 global 4
1:msg32: Actual local 4 global 4
1:msg32: Size desired 4 actual 4
1:msg32: tag_wild 0
1:msg32: Tag desired 16 actual 16
1:msg32: system_buffer 0
1:msg32: Buffer 0xcaad32c
1:msg32: 'Send: 0xcab7c00'
1:msg32: 'Data transfer completed'
--
2:msg5: Operation 1 (pending_receive) status 0 (pending)
2:msg5: Rank local 1 global 1
2:msg5: Size desired 4
2:msg5: tag_wild 0
2:msg5: Tag desired 16
2:msg5: system_buffer 0
2:msg5: Buffer 0xabbc348
2:msg5: 'Receive: 0xabd1780'
2:msg5: 'Data: 4 * MPI_FLOAT'
--
2:msg25: Operation 0 (pending_send) status 2 (complete)
2:msg25: Rank local 1 global 1
2:msg25: Actual local 1 global 1
2:msg25: Size desired 4 actual 4
2:msg25: tag_wild 0
2:msg25: Tag desired 16 actual 16
2:msg25: system_buffer 0
2:msg25: Buffer 0xabbc348
2:msg25: 'Send: 0xabc5700'
2:msg25: 'Data transfer completed'

这似乎表明发送已完成,但所有接收都处于待处理状态(上面只是标签值为 16 的日志的一小部分)。然而,这怎么可能发生呢?当然,如果没有相关的接收完成,发送就无法完成,因为在 MPI 中,所有发送和接收都必须匹配。至少我是这么想的...

任何人都可以提供任何见解吗?

我可以提供我用来执行此操作的代码,但是 Isend 和 Irecv 肯定应该工作,无论它们以什么顺序调用,假设 MPI_Waitall 在最后调用。

Update:代码可在这个要点 https://gist.github.com/909004

Update:我对代码进行了各种修改,但它仍然不能正常工作。新代码位于相同的要点 https://gist.github.com/909004,我得到的输出是这个要点 https://gist.github.com/910543。我对这段代码有很多疑问/问题:

  1. 当我在最后一个循环(打印所有数组)之前有一个 MPI_Barrier() 以确保在打印之前所有工作都已完成时,为什么最终循环的输出(打印所有数组)会散布在其余输出中?

  2. 从 0 级发送到 0 级是可能/明智的 - 这样可以吗? (当然,假设发布了正确的匹配接收)。

  3. 我在输出中收到很多非常奇怪的长数字,我认为这是某种内存覆盖问题或变量大小问题。有趣的是,这一定是 MPI 通信造成的,因为我将 new_array 初始化为值 9999.99,而通信显然导致它更改为这些奇怪的值。有什么想法吗?

总的来说,似乎发生了一些转置(矩阵的位似乎被转置了......),但绝对不是全部 - 正是这些即将出现的奇怪数字让我最担心!


使用时MPI_Isend and MPI_Irecv您必须确保在等待请求完成之前不要修改缓冲区,并且您肯定违反了这一点。如果您将所有接收数据都放入第二个矩阵而不是就地执行会怎样?

Also, global_x2 * global_y2是你的标签,但我不确定它对于每个发送-接收对来说都是唯一的,这可能会把事情搞砸。如果将其切换为发送标签会发生什么(global_y2 * global_columns) + global_x2和接收标签(global_x2 * global_columns) + global_y2.

编辑:至于您关于输出的问题,我假设您正在通过在同一台计算机上运行所有进程并仅查看标准输出来测试这一点。当您这样做时,即使 printf 代码全部在屏障之前执行,您的输出也会被终端奇怪地缓冲。我有两种方法可以解决这个问题。您可以为每个进程打印到单独的文件,也可以将输出作为消息发送到进程 0 并让他执行所有实际打印。

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

MPI_Isend 和 MPI_Irecv 似乎导致死锁 的相关文章

  • 为什么存在 async 关键字

    浏览 msdn 9 频道视频时 我发现以下未答复的评论 希望有人能解释一下 我不明白 async 关键字的意义 为什么不直接允许 任何时候方法返回任务时都会使用await关键字 就像迭代器一样 可以在任何返回 IEnumerable 的方法
  • clang 格式换行符在错误的位置

    给出以下代码行 get abc manager get platform status abc platform status sw update status fill update status actions allowed stat
  • 将字节数组转换为托管结构

    更新 这个问题的答案帮助我编写了开源项目GitHub 上的 AlicanC 现代战争 2 工具 https github com AlicanC AlicanC s Modern Warfare 2 Tool 你可以看到我是如何阅读这些数据
  • SSL/TLS/HTTPS 站点在 C#/.NET WebBrowser 控件中非常慢,但在 Internet Explorer 中则很好

    背景 我正在修改自动维基浏览器 http en wikipedia org wiki Wikipedia AutoWikiBrowser使用托管在安全服务器上的 MediaWiki 站点 我允许用户通过 C 应用程序中的 WebBrowse
  • CultureInfo 的实例(来自相同的文化)根据操作系统而变化

    我有一个网站 上面写着这样的日期 CultureInfo cultureInfo CultureInfo GetCultures CultureTypes AllCultures FirstOrDefault c gt string Equ
  • C++中delete和delete[]的区别[重复]

    这个问题在这里已经有答案了 可能的重复 C 中的删除与删除 运算符 https stackoverflow com questions 2425728 delete vs delete operators in c 我写了一个包含两个指针的
  • 从 C 结构生成 C# 结构

    我有几十个 C 结构 我需要在 C 中使用它们 典型的 C 结构如下所示 typedef struct UM EVENT ULONG32 Id ULONG32 Orgin ULONG32 OperationType ULONG32 Size
  • SFINAE 如何使用省略号?

    过去 当使用 SFINAE 选择构造函数重载时 我通常使用以下内容 template
  • 劫持系统调用

    我正在编写一个内核模块 我需要劫持 包装一些系统调用 我正在暴力破解 sys call table 地址 并使用 cr0 来禁用 启用页面保护 到目前为止一切顺利 一旦完成 我将公开整个代码 因此如果有人愿意 我可以更新这个问题 无论如何
  • OpenCV 2.4.3 中的阴影去除

    我正在使用 OpenCV 2 4 3 最新版本 使用内置的视频流检测前景GMG http docs opencv org modules gpu doc video html highlight gmg gpu 3a 3aGMG GPU算法
  • 默认析构函数做了多少事情

    C 类中的默认析构函数是否会自动删除代码中未显式分配的成员 例如 class C public C int arr 100 int main void C myC new C delete myC return 0 删除 myC 会自动释放
  • C++11 动态线程池

    最近 我一直在尝试寻找一个用于线程并发任务的库 理想情况下 是一个在线程上调用函数的简单接口 任何时候都有 n 个线程 有些线程比其他线程完成得更快 并且到达的时间不同 首先我尝试了 Rx 它在 C 中非常棒 我还研究了 Blocks 和
  • 二叉树中的 BFS

    我正在尝试编写二叉树中广度优先搜索的代码 我已将所有数据存储在队列中 但我不知道如何访问所有节点并消耗它们的所有子节点 这是我的 C 代码 void breadthFirstSearch btree bt queue q if bt NUL
  • DataTable:通过 LINQ 或 LAMBDA 进行动态 Group By 表达式

    我有一个数据表 我想在其中对未指定数量的字段进行分组 发生这种情况的原因是用户可以选择他想要分组的字段 所以 实际上 我将选择推入列表中 在这个选择上 我必须对我的数据表进行分组 想象一下这段代码 VB 或 C 都一样 public voi
  • 0-1背包算法

    以下 0 1 背包问题是否可解 浮动 正值和 浮动 权重 可以是正数或负数 背包的 浮动 容量 gt 0 我平均有 这是一个相对简单的二进制程序 我建议用蛮力进行修剪 如果任何时候你超过了允许的重量 你不需要尝试其他物品的组合 你可以丢弃整
  • 从 Delphi 调用 C# dll

    我用单一方法编写了 Net 3 5 dll 由Delphi exe调用 不幸的是它不起作用 步骤 1 使用以下代码创建 C 3 5 dll public class MyDllClass public static int MyDllMet
  • 如何引用解决方案之外的项目?

    我有一个 Visual Studio C 解决方案 其中包含一些项目 其中一个项目需要引用另一个不属于解决方案的项目 一开始我引用了dll
  • 受限 AppDomain 中的代码访问安全异常

    Goal 我需要在权限非常有限的 AppDomain 中运行一些代码 它不应该访问任何花哨或不安全的内容 except对于我在其他地方定义的一些辅助方法 我做了什么 我正在创建一个具有所需基本权限的沙箱 AppDomain 并创建一个运行代
  • 在 Xamarin 中获取 OutOfMemoryException

    java lang OutOfMemoryError 考虑增加 JavaMaximumHeapSize Java 执行时内存不足 java exe 我的 Visualstudio Xamarin 项目出现内存不足异常 请帮助我如何解决此问题
  • C#中为线程指定特殊的cpu

    我有 2 个线程 我想告诉其中一个在第一个 cpu 上运行 第二个在第二个 cpu 上运行 例如在具有两个 cpu 的机器中 我怎样才能做到这一点 这是我的代码 UCI UCIMain new UCI Thread UCIThread ne

随机推荐

  • Docker:旧版 --link 参数的等价物是什么

    我需要将我的数据库容器与服务器容器连接 现在我只是对遗留参数感到愤怒 link 效果完美 gt docker run d P name rethinkdb1 rethinkdb gt docker run d link rethinkdb
  • Android:使用 Webview 从资源中加载大图像

    我需要使用 Web 视图从资源中加载大图像 大约 3500 x 3500 像素 我在 Stackoverflow 上做了很多研究 但没有一个答案对我有用 我认为这可能是 Android 4 0 使用资源的问题 我当前的代码如下所示 WebV
  • 具有通用代码的 Git 项目

    我们有几个项目正在进行中 它们共享大部分代码 配置文件 我们使用的框架具有某些目录和文件依赖性 这限制了我们可以隔离公共代码的程度 例如 在 common projectA 和 projectB 之间我们可能有 项目A shared dir
  • java中如何从当前日期减去n天? [复制]

    这个问题在这里已经有答案了 我想从Java中的当前日期减去n天 我怎么做 您不必使用日历 您可以只使用时间戳 Date d initDate intialize your date to any date Date dateBefore n
  • 我的应用程序泄漏了我的可绘制文件夹中没有的随机形状的位图

    我有一个奇怪的内存泄漏问题 我的应用程序不断泄漏Bitmap对象和其他相关对象 例如VectorDrawables AnimationDrawables 我有通过Eclipse Memory AnalyzerGimp 能够恢复泄露的内容Bi
  • 如何使用 dagger 限定符注释来提供不同的 OkHttpClient 构建器?

    我正在尝试使用 dagger 限定符在我的 android 应用程序中提供不同类型的 OkHttpClient Builder 例如 我有两个注释 即 Authorized 和 WithTime 每个注释都应该向客户端构建器添加一些拦截器
  • 如何使用 itextsharp C# 从签名字段中删除有效性未知图标?

    在计算 pdf 的哈希值之前 如何从签名字段中删除有效性未知图标 问号 下面的代码我用来创建签名字段 PdfStamper stamper PdfStamper CreateSignature reader os 0 PdfSignatur
  • Macos 上输出中的 gnuplot pdfcairo 未命名 Type 3 字体

    带有 pdfcairo 终端的 Gnuplot 似乎在字体方面给出了奇怪的行为 其中生成的 pdf 具有未命名的 Type 3 字体 以下是 pdffonts 在输出 pdf 文件上的输出 name type encoding emb su
  • 在Java中将ANSI字符转换为UTF-8

    有没有办法使用 Java 将 ANSI 字符串转换为 UTF 我有一个自定义序列化程序 它使用 DataInputStream 类的 readUTF 和 writeUTF 方法来反序列化和序列化字符串 如果我收到一个以 ANSI 编码的字符
  • setTimeout 无法绑定到“this”原型函数[重复]

    这个问题在这里已经有答案了 我写了一个代码 我想看看 Hello world 每一秒 但我已经undefined我找不到我的错误在哪里 function Greeting message delay this message message
  • 将形状添加到幻灯片并设置格式

    我正在尝试制作下面的 vba 脚本来向 powerpoint 幻灯片添加注释注释 这个想法是 该脚本可用于向幻灯片添加 待检查的注释 因此 我将其设置在一个显示菜单的小插件中 以便添加 TBC TBU TBD 注释 该子系统时不时地显示错误
  • 不是作为 jQuery Deferred 执行的异步函数

    假设我想以同步方式处理一些任务 所以我有这个函数 function executePromiseQueueSync queue var seed Deferred finalPromise finalPromise reduce queue
  • 启用安全辅助紧急模式

    对我来说 实施和学习这是一件非常有趣和新鲜的事情 我的申请有一些要求 为此 我进行了很多搜索 但找不到合适且有价值的东西或链接 所以我在这里发布我的问题 其功能有 1 在三星设备中有Safety Assistance您可以在其中找到菜单Em
  • 简单的多维 C 型数组出现分段错误:11

    const int L 10 std complex
  • cv2.Canny() 是否执行高斯模糊?

    我知道在使用 Canny 检测边缘之前对图像应用高斯模糊非常重要 我的问题是 cv2 Canny 单独进行高斯模糊或者有必要应用cv2 GaussianBlur before cv2 Canny 文档在这一点上并不清楚 回想一下 在 Pyt
  • Pyspark from_unixtime (unix_timestamp) 不转换为时间戳

    我正在使用 Pyspark 和 Python 2 7 我在字符串中有一个日期列 带毫秒 并且想转换为时间戳 这是我到目前为止所尝试过的 df df withColumn end time from unixtime unix timesta
  • Excel VBA 文本框时间验证为 [h]:mm

    我正在开发 VBA Excel 用户窗体 需要以 h mm 格式输入时间 这意味着小时数可以不受限制 并且不会像 hh mm 格式那样在 23 59 之后循环回 0 我在网上搜索过没有结果 这是我当前使用的代码 Private Sub Tx
  • 运行任务时显示 Gradle 控制台

    当我在 Android Stduio 中运行 gradle 任务时 如何显示 gradle 控制台 当我执行任务时 会弹出运行对话框 但控制台不会弹出 我希望能够看到 gradle 控制台 以便可以看到输出 但我不想永久看到 gradle
  • 通过多次变换替换和维护角色实体

    问题 我们的系统中存在各种格式的字符实体 例如 amp and amp amp 如果需要的话 我们需要将它们转换为标准 XML 字符实体 amp lt gt apos quot 然后通过几个单独的转换将它们维护为实体 给定 XML
  • MPI_Isend 和 MPI_Irecv 似乎导致死锁

    我在 MPI 中使用非阻塞通信在进程之间发送各种消息 然而 我似乎陷入了僵局 我用过PADB see here http padb pittman org uk 查看消息队列并得到以下输出 1 msg12 Operation 1 pendi