首页 文章

并行示范计划

提问于
浏览
5

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

考虑到这一点,我寻找用C语言编写的主要计算程序 . 对于任何纯粹主义者来说,该程序实际上并不是我的任务的一部分,因为我发现quite a few示例程序,但这些程序似乎并没有实际并行运行 . 它们确实在我的节点之间分配所有步骤,因此如果一个节点具有更快的处理器,则总体时间将减少,但添加额外节点不会加速计算 .

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

EDIT

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

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

2 回答

  • 2

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

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

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

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

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


    EDIT

    您必须记住,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中,您只需要收集从所有线程生成的比率,这是非常小的开销,因此为您的集群提供了完美的概念证明问题 .

  • 4

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

    • 在适当的条件下,它与 Worker 数量成比例;

    • 易于实施;

    • 它具有内置的负载 balancer 功能 .

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

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

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

相关问题