我了解多线程程序和依赖机器间通信的程序之间的区别。我的问题是我有一个很好的用“C”编写的多线程程序,它在 8 核机器上运行良好。现在有机会将此程序移植到集群以访问更多内核。是否值得努力撕掉 pthread 的东西并改造 MPI(我从未使用过),或者我们最好从头开始重新编码整个东西(或大部分)?假设我们被 C “卡住”了,所以不能选择大规模改变语言。
2 回答
根据您的软件的编写方式,使用 MPI 可能比保留 pthread 实现更有优势,也可能没有优势。
不幸的是(或幸运的是),消息传递与 pthreading 完全不同——基本假设完全不同。我喜欢Maestro 团队的 Joshua Phillips 的这句话:“消息传递和共享状态通信之间的区别等同于向同事发送电子邮件要求她完成任务和打开她的组织者来写的区别将任务直接放在她的待办事项列表中。不只是粗鲁,后者可能会让她感到困惑——她可能会抹去它,没有注意到它,或者不小心把它的优先顺序放错了。”
不幸的是,您共享数据的方式非常不同。无法直接访问其他线程中的数据(因为它可以在其他机器上),因此从 pthread 迁移到 MPI 可能是一项非常艰巨的任务。另一方面,如果代码是这样编写的,每个线程都是隔离的,这可能是一件容易的事,而且绝对值得。
为了确定这将有多大用处,您需要了解代码,以及您希望通过切换实现什么。作为一种学习体验可能是值得的(通过在 MPI 中工作,您学到了很多关于同步和线程的知识),但如果收获很小,则可能不实用。
关于。您对 Reed 的评论——这听起来像是一个简单、低开销的 MPI 转换。请注意:并非所有 MPI API 都支持动态创建进程,即,您使用 N 个进程(在启动时指定)启动程序,并且在程序的整个生命周期中都被 N 个进程困住。