【发布时间】: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。我重申没有在此函数中发生处理器间通信。以下是否会导致如此大的时间变化?
- 函数内部的条件 if 循环
- 输入变量值的大小。例如,如果处理器中的大多数值接近 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