我在12个线程中并行化了一个模拟引擎,在12个节点的集群上运行它(每个节点运行一个线程)。由于12个系统的可用性通常较少,我还调整了6个线程(在6个节点上运行),4个线程(在4个节点上运行),3个线程(在3个节点上运行)和2个线程(在2个节点上运行)。我注意到节点/线程的数量越多,速度越快。但显然,我使用的节点越多,执行就越昂贵(在成本和功耗方面)。
我想在日记中发布这些结果,所以我想知道是否有任何法律/定理可以帮助我决定运行该程序的最佳节点数?
谢谢,
Akshey
答案 0 :(得分:3)
您如何并行化您的程序以及每个节点内部的内容?
例如,在我的一个集群上,我有几百个节点,每个节点包含4个双核Xeon。如果我要在这个集群上运行OpenMP程序,我会在一个节点上执行一次,并启动不超过8个线程,每个处理器核心一个。我的集群由Grid Engine管理并用于批处理作业,因此在作业运行时不会发生争用。通常,要求运行OpenMP作业的多个节点没有意义,因为共享内存方法不适用于分布式内存硬件。通过在8核节点上要求少于8个线程,我没有多少收获,我有足够的硬件可以不必共享它。
如果您使用过分布式内存编程方法,例如MPI,那么您可能正在使用多个进程(而不是线程),并且可能正在不同节点上的核心上执行这些进程,并且正在支付通信流量方面的成本。
由于@Blank已经指出了运行程序的最有效方法,如果效率一意味着“最小化总CPU时数”,就是在1核上运行程序。只要。然而,对于我的工作,例如,一周可以使用256个核心,等待128周,一个核心完成其工作并不吸引人。
如果您还不熟悉以下条款,Google会为他们提供帮助或前往维基百科:
答案 1 :(得分:2)
“如果有任何法律/定理可以帮助我确定我应该运行该程序的最佳节点数量吗?”
没有这样的一般规律,因为每个问题的特征都略有不同。
您可以在不同数量的节点上建立问题性能的数学模型,知道必须完成多少计算工作,以及需要完成多少通信,以及每个节点需要多长时间。 (通信时间可以通过通信量以及节点类型互连的典型延迟/带宽数来估算)。这可以指导您做出好的选择。
这些模型对于理解正在发生的事情很有价值,但是对于某些给定的问题大小,实际上确定为您的代码运行的正确节点数量,实际上没有任何东西可以替代运行扩展测试 - 运行问题各种数量的节点,实际上看它是如何执行的。您想看的数字是:
如何选择“正确”的节点数?这取决于你必须运行多少个工作,以及计算资源的可接受用途。
因此,例如,在绘制计时结果时,您可能会发现在某些处理器(例如32)处完成T(P)的时间最短。因此,这似乎是“最佳”选择。但是当你看效率数字时,很明显效率在此之前很久就开始急剧下降;并且你只比(比方说)运行时间减少了20%而不是在16个处理器上运行 - 也就是说,对于2倍的计算资源,你的速度只增加了1.25倍。这通常是一个糟糕的交易,你宁愿用更少的处理器运行 - 特别是如果你有很多这样的模拟运行。 (例如,如果您有两个模拟运行,在这种情况下,您可以通过在16个处理器上同时运行两个模拟,而不是在32个处理器上一次运行一个,以1.25时间单位完成2个时间单位的完成)。
另一方面,有时你只需要做几次运行,时间真的很重要,即使你使用的资源效率也不高。财务建模可以是这样的 - 他们需要预测明天的市场现在,他们有钱投入计算资源,即使它们没有100%有效使用。
在任何并行编程教程的“并行性能简介”部分中讨论了其中一些概念;这是我们的例子,https://support.scinet.utoronto.ca/wiki/index.php/Introduction_To_Performance
答案 2 :(得分:0)
增加节点数会导致收益递减。两个节点的速度不是一个节点的两倍;四个节点甚至比两个节点少。因此,节点的最佳数量总是一个;只需一个节点,您就可以完成每个节点的大部分工作。