5

我刚刚完成的一项任务要求我创建一组脚本,这些脚本可以将随机 Ubuntu 机器配置为 MPI 计算集群中的节点。这一切都已经完成,节点之间可以正常通信。但是,我现在想通过向它抛出一个并行程序来展示所述 MPI 集群的效率。我只是在寻找一种可以在可用进程(=节点)数量之间划分工作的直接蛮力计算:如果一个节点需要 10 秒来运行程序,4 个节点应该只需要大约 2.5 秒。

考虑到这一点,我寻找了一个用 C 编写的素数计算程序。对于任何纯粹主义者来说,该程序实际上并不是我作业的一部分,因为我正在学习的课程纯粹是系统管理。我只需要任何能表明我的集群正在运行的东西。我有一些编程经验,但很少使用 C 语言,也没有使用 MPI。我发现了很多示例程序,但这些程序似乎都没有真正并行运行它们确实在我的节点之间分配了所有步骤,因此如果一个节点具有更快的处理器,则总时间将会减少,但添加额外的节点并不能加快计算速度。

难道我做错了什么?我发现的程序根本不是并行的吗?我需要为 MPI 学习 C 编程来编写自己的程序吗?是否有任何其他并行 MPI 程序可用于演示我的集群在工作中?

编辑

感谢下面的答案,我设法让几个 MPI 脚本正常工作,其中前 N 个自然数的总和(这不是很有用,因为它遇到数据类型限制)、素数的计数和生成以及Pi 的蒙特卡洛计算。有趣的是,只有素数程序才能通过多个节点/进程实现(有时是戏剧性的)性能提升。

导致我最初的脚本运行问题的大部分问题都相当模糊,显然是由于节点上的主机文件问题。使用参数运行 mpiexec-disable-hostname-propagation解决了这个问题,它可能以多种方式表现出来:MPI(R) 屏障错误、TCP 连接错误和其他一般连接失败。我相信集群中的所有节点可能有必要通过主机名相互了解,这对于在服务器节点上运行 DHCP/DNS 的经典 Beowulf 集群来说并不是一个真正的问题。

4

2 回答 2

4

并行编程中通常的概念验证应用是简单的光线追踪。

话虽如此,我认为光线追踪并不是展示 OpenMPI 强大功能的好例子。我会把重点放在分散/聚集甚至更好的分散/减少上,因为那是 MPI 获得真正力量的地方:)

最基本的例子是计算前 N 个整数的总和。您需要有一个主线程,它适合值范围以汇总到一个数组中,并将这些范围分散到工作人员的数量上。

然后你需要做一个减少并根据显式公式检查你的结果,以获得免费的验证测试。

如果您正在寻找 MPI 的弱点,并行 grep 可能会起作用,其中 IO 是瓶颈。


编辑

您必须记住,MPI 基于无共享架构,其中节点使用消息进行通信,并且节点的数量是固定的。这两个因素为在其上运行的程序设置了一个非常严格的框架。长话短说,这种并行性非常适合数据并行应用程序,但不适用于任务并行应用程序,因为如果节点数量发生变化,您通常可以比任务更好地分发数据。

此外,MPI 没有隐式工作窃取的概念。如果一个节点完成工作,它只是等待其他节点完成。这意味着,您必须自己弄清楚最弱链接的处理方式。

MPI 在性能细节方面非常可定制,例如,MPI_SEND 有许多不同的变体。这为性能调整留下了很大的空间,这对于高性能计算很重要,MPI 是为此设计的,但主要是让“普通”程序员感到困惑,导致程序在并行运行时实际上变得更慢。也许你的例子很糟糕:)

关于放大/加速问题,嗯......

我建议您阅读阿姆达尔定律,您会发现仅通过添加更多节点来获得线性加速是不可能的 :)

我希望这有帮助。如果您仍有疑问,请随时发表评论:)


编辑2

也许与 MPI 完美结合的最佳缩放问题是 Pi 的经验估计。

在边长为 1 的正方形内成像半径为 1 的四分之一圆,然后您可以通过将随机点发射到正方形中来估计 Pi,并计算它们是否在四分之一圆内。

注意:这等于在 [0, 1] 中使用 x,y 生成元组 (x,y) 并测量其中有多少具有 x² + y² <= 1。

然后 Pi 大致等于

4 * Points in Circle / total Points

在 MPI 中,您只需要收集所有线程生成的比率,开销很小,因此可以为您的集群提供完美的概念证明问题。

于 2013-03-08T18:55:44.797 回答
2

与任何其他计算范例一样,在分布式内存编程中使用了某些完善的模式。一种这样的模式是“工作包”或“控制器/工人”(以前称为“主/从”,但现在这个名称被认为在政治上不正确)。它最适合您的情况,因为:

  • 在适当的条件下,它与工人的数量成比例;
  • 易于实施;
  • 它具有内置的负载平衡。

基本前提非常简单。“控制器”进程有一个大表/作业队列,实际上执行一个大循环(可能是无限循环)。它侦听来自“工作”进程的消息并做出响应。在最简单的情况下,worker 只发送两种类型的消息:工作请求或计算结果。因此,控制器进程发送两种类型的消息:工作描述或终止请求。

这种模式的典型非平凡示例是为Mandelbrot 集着色。计算最终图像的每个像素完全独立于其他像素,因此即使在具有高延迟慢速网络连接(例如 GigE)的集群上也可以很好地扩展。在极端情况下,每个工作人员可以计算单个像素,但这会导致非常高的通信开销,因此最好将图像分割成小矩形。可以找到许多为 Mandelbrot 集着色的现成 MPI 代码。例如,此代码使用行分解,即单个作业项填充最终图像的一行。如果 MPI 进程的数量很大,则必须具有相当大的图像尺寸,否则负载将无法很好地平衡。

MPI 还具有允许以客户端/服务器方式生成额外进程或附加外部启动作业的机制。实现它们不是火箭科学,但仍然需要对高级 MPI 概念(如互通器)有一些了解,所以我暂时跳过。

于 2013-03-09T09:46:37.213 回答