【问题标题】:Varying times during MPI parallel runsMPI 并行运行期间的不同时间
【发布时间】:2015-05-18 14:29:40
【问题描述】:

我为有限体积求解器编写了 C++ 代码,以模拟非结构化网格上的 2D 可压缩流,并使用 MPI (openMPI 1.8.1) 并行化我的代码。我使用 gmsh-Metis 将初始网格划分为 N 个部分(等于正在使用的处理器数量)。在求解器中,有一个函数可以计算各个分区中每个局部面的数值通量。此函数将左/右值和重构状态(在函数调用之前评估)作为输入,并返回相应的通量。在此函数调用期间,没有处理器间通信,因为所有输入数据都在本地可用。我使用 MPI_Wtime 来查找每个此类函数调用所花费的时间。使用 6 个处理器(Intel® Core™ i7 (3770)),我得到以下结果:

处理器 1: 127.467 分钟内调用了 1406599932 次​​p>

处理器 2: 18.5758 分钟内调用 1478383662 次​​p>

处理器 3: 1422943146 次呼叫在 65.3507 分钟内

处理器 4: 1439105772 次呼叫在 40.379 分钟内

处理器 5: 1451746932 次呼叫在 23.9294 分钟内

处理器 6: 1467187206 次呼叫在 32.5326 分钟内

我对时间安排感到非常惊讶,尤其是来自处理器 1 和 2 的时间。处理器 2 的调用次数比处理器 1 多近 8000 万次,但占用的时间是处理器 1 的 1/7。我重申没有在此函数中发生处理器间通信。以下是否会导致如此大的时间变化?

  1. 函数内部的条件 if 循环
  2. 输入变量值的大小。例如,如果处理器中的大多数值接近 0。

如果不是这些,这种差异背后还有其他原因吗?

【问题讨论】:

  • 你确定你的型号正确吗,根据这个ark.intel.com/products/65719/… i7-3770 只是一个四核处理器(尽管它是超线程的,可以向操作系统显示 8 个逻辑核心)
  • 您可以使用profiler 来确定时间花费最多的地方
  • 是的,西蒙,你说得对,只有 4 个具有超线程的物理内核。但是,即使只使用 2 或 4 个内核,我也看到了时序问题。正如 tcb 所建议的,分析器可能会更清楚地了解正在发生的事情。
  • 只是好奇:左/右值 重构状态是什么意思?他们不一样吗?接下来,我假设您还将法线面向量 传递给函数进行通量计算。因此,根据 Metis 进行的分区,有可能其中一个处理器幸运地得到大多数人脸的 nx = 0 或 ny = 0。但是,这可能不会导致时间发生如此剧烈的变化。
  • 也许你得到了很多落入非正规范围的浮点值?异常可能会导致大幅减速。例如,见stackoverflow.com/questions/9314534/…

标签: parallel-processing mpi timing numerical-methods


【解决方案1】:

一般来说,您所描述的现象称为负载不平衡。这种不平衡的潜在来源有很多,具体取决于问题、您的数值方法、您的并行化方案、您的输入数据、您的操作系统/运行时/应用程序配置,甚至您的硬件!

硬件

您声明的处理器支持英特尔 TurboBoost、英特尔 RAPL 以及动态电压和频率缩放。其中任何一个都可能导致在某些内核上运行的线程/进程最终完成得比在其他内核上更快。在尝试解决这些问题时,为了清楚起见,我建议将您的系统配置为禁用这些功能,以及您的 BIOS 可能提供的任何空闲/睡眠状态节能选项。然后重新运行您的基准测试。

配置

您希望将并行执行的程度和分配与可用于在系统上运行程序的实际资源相匹配。这意味着一些事情

  • 关闭同时运行的干扰严重的进程
  • 进程计数的最佳选择可能是硬件内核的数量、硬件线程的数量,或者比每个少一个以允许操作系统在不干扰的情况下调度其他进程
  • 确保每个进程与不同的处理器内核/线程之间的调度亲和性。这可以确保操作系统调度程序不会持续尝试移动您的进程而没有任何好处,并且它们不会在本应独立运行时争夺同一个执行单元。

应用特定问题

  • 您对网格的划分是否在各个进程中相对均匀?它们是否具有相似数量的元素,以及相似的边界和内部份额?边界条件通常与内部元素具有非常不同的计算成本。您可能需要告诉分区器每个元素的权重不相等,以便它可以尝试生成权重大致相等的分区,而不是元素计数。
  • 您的问题域的某些部分是否比其他部分的计算成本更高?您的问题提到了相关函数中的 if 语句。如果由于分支预测错误,某些进程得到了一个全向单向的集合,而另一个是混合的,则评估条件本身可能会导致变化。更严重的是,这两个分支代表的工作量大不相同。如果某些进程占用一个分支的次数比其他进程多得多,那么它们的工作负载就会相应地有所不同。
  • 此函数是否对每个网格元素使用任何类型的迭代/收敛数值方法,其中不同的元素可能需要不同数量的迭代才能达到解决方案。不同的进程可能有不同的元素计算成本分布。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-25
    • 2014-08-18
    • 2011-07-14
    • 1970-01-01
    相关资源
    最近更新 更多