并行示范计划

时间:2013-03-08 17:21:31

标签: c mpi openmpi

我刚刚完成的一项任务要求我创建一组脚本,可以将随机Ubuntu计算机配置为MPI计算集群中的节点。这一切都已完成,节点可以正确地相互通信。但是,我现在想通过抛出一个并行程序来证明所述MPI集群的效率。我只是在寻找一种直接的强力计算,它可以在可用的进程数(=节点数)之间进行分工:如果一个节点需要10秒钟来运行程序,那么4个节点应该只需要2.5左右。

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

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

修改

由于下面的答案,我设法得到了几个MPI脚本,其中包括前N个自然数的总和(因为它运行到数据类型限制时不是很有用),计数和生成素数和Pi的蒙特卡罗计算。有趣的是,只有素数程序才能通过多个节点/进程实现(有时是戏剧性的)性能提升。

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

2 个答案:

答案 0 :(得分:4)

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

话虽这么说,我不认为光线追踪是炫耀OpenMPI力量的一个很好的例子。我强调分散/聚集甚至更好的分散/减少,因为这是MPI获得真正力量的地方:)

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

然后,您需要进行缩减并根据显式公式检查结果,以获得免费的验证测试。

如果你正在寻找一个较弱的MPI点,那么并行grep可能会起作用,其中IO是瓶颈。


修改

您必须记住,MPI基于无共享架构,其中节点使用消息进行通信,并且节点数量是固定的。这两个因素为运行它的程序设置了一个非常紧凑的框架。总而言之,这种并行性对于数据并行应用程序非常有用,但对于任务并行应用程序来说很糟糕,因为如果节点数量发生变化,通常可以比任务更好地分发数据。

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

MPI在性能细节方面非常可定制,例如,MPI_SEND有许多不同的变体。这为性能调整留下了很大空间,这对于MPI设计的高性能计算非常重要,但是大多数人都会混淆“普通”程序员,导致程序在并行运行时实际上变慢。也许你的例子只是吮吸:))

关于升级/加速问题,好吧......

我建议你阅读Amdahl定律,你会发现只需添加更多节点就不可能获得线性加速:)

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


<强> EDIT2

可能与MPI完美整合的最佳缩放问题是Pi的经验估计。

对半径为1的四分之一圆进行成像,在一个边长为1的正方形内,然后你可以通过向正方形中激发随机点来估算Pi,并计算它们是否在四分之一圆内。

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

Pi大致等于

4 * Points in Circle / total Points

在MPI中,您只需收集所有线程生成的比率,这是非常小的开销,因此为您的群集提供了完美的概念证明。

答案 1 :(得分:2)

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

  • 在适当的条件下,它会与工人数量相称;
  • 易于实施;
  • 它内置了负载均衡功能。

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

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

MPI还具有允许以客户端/服务器方式生成其他进程或附加外部启动的作业的机制。实现它们不是火箭科学,但仍然需要对交互系统之类的高级MPI概念有所了解,所以我暂时不会这样做。