我有一个简单的DO循环(Fortran 90),其中各个迭代彼此独立,只有来自/到硬盘的输入/输出数据(进程不在彼此之间交换消息/ MPI)我使用MPI并行化了。 在顺序运行中,循环的一次迭代大约需要一天才能完成。如果我并行运行29次此类迭代,则需要大约2.5天。它位于超级计算机的一个节点上(即没有节点间通信)。
我听说有人告诉我们,如果是简单的可并行化的程序(循环中的独立步骤),总执行时间应该接近于在循环中只运行一步的执行时间。
问题:这个加速对你来说看起来不错吗?
非常感谢。
答案 0 :(得分:1)
由于您有独立的迭代,因此29个内核上29次迭代的运行时不应该来自单个内核上单次迭代的运行时。除非满足以下一个或多个条件,否则您应该接近一天:
答案 1 :(得分:1)
因此,在扩展到代码的29个并行副本时,您的运行速度只有您希望的一半?
内存带宽可能是一个问题,同一算法的29个副本同时读取/写入自己的内存。这就是为什么在这样的情况下,在一次迭代中寻找并行性可能会更好(但更难)。
让我们使用视频编码作为“一次迭代”可能的具体示例。例如,并行编码29个视频就像OP提出的那样。让x264使用32个内核对一个视频进行编码,然后对接下来的28个视频重复使用,使用更少的总RAM,并更好地缓存。
实际上,可能有2或3个并行的视频,每个使用10到16个线程,这样会很好,因为x264可以找到多少并行度。
这取决于算法,以及它与多线程的扩展程度。如果没有,或者你没有时间对其进行编码,那么就一路暴力。超过10加速的因素是没有什么可以打喷嚏基本上没有努力。 (例如,在make -j29
或GNU parallel
的不同数据集上运行单线程程序,或者在单个程序中使用多个线程运行。:)
当您的代码正在运行时,您可以检查CPU利用率,以确保您保持29个CPU内核忙碌,就像您正在尝试的那样。您还可以使用分析工具(如Linux perf
)来调查缓存效果。如果并行运行的数据缓存未达到单线程运行的29倍,那么这将开始解释事情。