【问题标题】:Converting a pthreaded program to MPI?将 pthread 程序转换为 MPI?
【发布时间】:2010-10-13 06:06:21
【问题描述】:

我了解多线程程序和依赖机器间通信的程序之间的区别。我的问题是我有一个很好的用“C”编写的多线程程序,它在 8 核机器上运行良好。现在有机会将此程序移植到集群以访问更多内核。是否值得努力撕掉 pthread 的东西并改造 MPI(我从未使用过),或者我们最好从头开始重新编码整个东西(或大部分)?假设我们“卡”在 C 语言上,因此无法选择大规模更改语言。

【问题讨论】:

    标签: c refactoring pthreads cluster-computing


    【解决方案1】:

    回复。您对 Reed 的评论——这听起来像是一个简单、低开销的 MPI 转换。请注意:并非所有 MPI API 都支持动态创建进程,也就是说,您在启动程序时使用了 N 个进程(在启动时指定),并且在程序的整个生命周期中都被 N 个进程卡住了。

    【讨论】:

    • 谢谢。我认为该评论可能会添加有助于提出建议的细节。您的回复也说明了这种转换的潜在便利性:每次运行该程序时,都先验地知道需要多少线程(MPI 中的进程)。谢谢!
    • 为您的目标平台选择正确的 MPI 库在这里有很大帮助。某些 MPI 实现在特定任务上比其他实现更好,但对它们的编程应该非常接近,因此尝试不同的选项通常相当容易。
    【解决方案2】:

    根据您的软件的编写方式,与保留 pthread 实现相比,使用 MPI 可能有优势,也可能没有优势。

    不幸的是(或幸运的是),消息传递与 pthreading 完全不同——基本假设完全不同。我爱this quote from Joshua Phillips of the Maestro team:“消息传递和共享状态通信的区别就相当于给同事发邮件要求她完成任务和打开她的组织者直接在她身上写下任务的区别待办事项清单。不只是粗鲁,后者可能会让她感到困惑——她可能会删除它,没有注意到它,或者不小心将它的优先级错误地排序。”

    很遗憾,您共享数据的方式非常不同。无法直接访问其他线程中的数据(因为它可以在其他机器上),因此从 pthread 迁移到 MPI 可能是一项非常艰巨的任务。另一方面,如果代码是这样编写的,每个线程都是隔离的,这可能是一件容易的事,而且绝对值得。

    为了确定这将有多大用处,您需要了解代码,以及您希望通过切换实现什么。作为一种学习体验可能是值得的(通过在 MPI 中工作,您学到了很多关于同步和线程的知识),但如果收获很小,则可能不实用。

    【讨论】:

    • 感谢您的快速回复。该程序确实具有主从架构的优势。一个线程启动许多相同的子线程。没有一个子线程需要与任何其他线程进行通信。并且主从之间交换的数据少且不频繁。
    • 如果是这样的话,移植到 MPI 可能会相当困难。另一个问题是线程如何将它们的结果传达回主线程 - 是否有很多信息传回?那么,状态和结果可能是您唯一担心的问题。
    • 再次感谢。它基本上是主设置,使所有子问题都可以使用一些数据,每个子问题都基于该数据做一些工作,然后每个结果都对主问题可用。大师做一些工作并重复。为了协调,它基本上是一个“睡觉的理发师问题”。
    • 它应该是一个相当简单的端口,如果你有集群来运行它,这可能是一个不错的举措。您正在使用什么操作系统?
    • 目前的8核盒子是RHEL 4,集群是基于SUSE的。一切都是Linux,这很好。我曾希望程序架构的简单性会导致对 MPI 的更直接的移植。如果我之前没有指出,那都是我自己使用几个库的代码。还有其他建议吗?
    猜你喜欢
    • 2020-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-19
    • 1970-01-01
    • 1970-01-01
    • 2021-09-17
    • 2019-04-23
    相关资源
    最近更新 更多