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

Parallel processing MPI并行运行期间的不同时间 我编写了一个C++代码,用于有限体积求解器,模拟非结构化网格上的2D可压缩流,并使用MPI(OpenMPi 1.8-1)并行化了我的代码。我使用gmsh Metis将初始网格划分为N个部分(等于使用的处理器数量)。在解算器中,有一个函数用于计算各个分区中每个局部面的数值通量。此函数将左/右值和重构状态(在函数调用之前评估)作为输入,并返回相应的通量。在此函数调用期间,没有处理器间通信,因为所有输入数据都在本地可用。我使用MPI_Wtime来查找每次此类函数调用所花费的时间。具有6个处理器(英特尔®核心™ i7(3770)),我得到以下结果:,parallel-processing,mpi,timing,numerical-methods,Parallel Processing,Mpi,Timing,Numerical Methods,处理器1:127.467分钟内拨打1406599932次电话 处理器2:18.5758分钟内拨打1478383662次电话 处理器3:65.3507分钟内拨打1422943146个电话 处理器4:40.379分钟内拨打1439105772次电话 处理器5:在23.9294分钟内拨打1451746932次电话 处理器6:32.5326分钟内完成1467187206次呼叫 我对计时非常惊讶,尤其是来自处理器1和2的计时。处理器2比处理器1多发出近8000万次呼叫,但所需时间是处理器1的1/7。我再次

处理器1:127.467分钟内拨打1406599932次电话

处理器2:18.5758分钟内拨打1478383662次电话

处理器3:65.3507分钟内拨打1422943146个电话

处理器4:40.379分钟内拨打1439105772次电话

处理器5:在23.9294分钟内拨打1451746932次电话

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

我对计时非常惊讶,尤其是来自处理器1和2的计时。处理器2比处理器1多发出近8000万次呼叫,但所需时间是处理器1的1/7。我再次重申,在这个函数中没有发生处理器间通信。以下情况会导致时间上的巨大变化吗

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

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

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

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

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

    • 关闭同时运行的严重干扰进程
    • 进程计数的最佳选择可能是硬件内核的数量、硬件线程的数量,或者比每一个线程少一个,以允许操作系统在不干扰的情况下调度其他进程
    • 确保每个进程与不同处理器核心/线程之间的调度关联性。这既可以确保操作系统调度程序不会持续地尝试移动进程而没有任何好处,也可以确保它们不会在本应独立运行时争夺同一执行单元
    特定于应用程序的问题
    • 网格的分区是否在整个过程中相对均匀?它们是否有相似数量的元素,以及相似的边界和内部共享?边界条件的计算量通常与内部单元的计算量非常不同。您可能需要告诉分区器每个元素的权重不相等,以便它可以尝试生成近似相等权重的分区,而不是元素计数
    • 您的问题域的某些部分计算起来是否比其他部分更昂贵?您的问题提到相关函数中的
      if
      语句。如果由于分支预测失误,某些进程获得的集合都是单向的,而另一个集合是混合的,则评估条件本身可能会导致变化。更严重的是,这两个分支所代表的工作量大不相同。如果某些流程比其他流程占用的分支多得多,那么它们的工作负载将相应地有所不同
    • 对于每个网格单元,此函数使用任何类型的迭代/收敛数值方法,其中不同的单元可能需要不同的迭代次数才能获得解。不同的过程可能具有不同的元素计算成本分布

    你确定你的型号是正确的吗?根据这一点,i7-3770只是一个四核处理器(虽然它是超线程的,可以向操作系统显示8个逻辑核)。你可以使用a来计算时间花在哪里。Simon你说得对,只有4个物理核具有超线程功能。然而,即使只使用2或4个内核,我也看到了计时问题。正如tcb所建议的,分析器可能会更清楚地描述正在发生的事情。只是好奇:你所说的左/右值和重构状态是什么意思?他们不一样吗?接下来,我假设您也将法向面向量传递给函数以进行通量计算。因此,根据Metis所做的分区,其中一个处理器有可能幸运地获得大多数面的nx=0或ny=0。然而,这可能不会导致计时发生如此剧烈的变化。也许你会得到很多浮点值,而这些浮点值正落入非规范化范围?非规范化会导致大幅减速。例如,见