【问题标题】:Master-worker model and hybrid MPI/OpenMP主从模型和混合 MPI/OpenMP
【发布时间】:2017-10-09 04:37:54
【问题描述】:

对于我开发的一个软件包,我使用了主/工作方案,其中一个进程将工作分配给其他进程。分配的工作是独立的,但需要很长时间才能完成,并且从共享内存环境中受益匪浅。所以,现在我有一个进程/节点,所以每个 MPI 进程都有,例如,12 个处理器和一个共享内存环境来运行 OpenMP。这一切都很好,但是我的“主”进程有 11 个空闲处理器,1 个只是分配工作=(我有一些想法可以解决这个问题,并且正在寻找任何输入或其他想法:

  • 在主节​​点上,分配一个处理器来分配工作,并且 其他 11 人实际工作。从概念上讲,这似乎是 明显的解决方案,但我无法弄清楚如何实际 实施这样的计划。
  • 让主节点通过非阻塞发送分配所有工作 计划一开始,就参与完成工作。同样,这在概念上很简单,但不知道 MPI 是否真的支持这样的方案(我认为不支持)。这就是说,发送了 100 条消息,等待任何单个进程接收。
  • 让所有进程为所有分配的工作加载数据,并从不同的点开始。当一个进程开始一个任务时,向所有其他进程广播该任务正在进行中,因此它不会被另一个进程选择。这似乎是最好的选择,但我担心两个进程会在广播到达它们之前同时选择一个任务。尽管两个进程不太可能同时选择一项新任务,但这似乎是有可能的。

【问题讨论】:

    标签: mpi openmp


    【解决方案1】:

    显而易见的解决方案很容易实现。首先,创建一个看起来像这样的 MPI 主机文件(Open MPI 格式):

    node1 slots=2
    node2 slots=1
    node3 slots=1
    node4 slots=1
    

    然后运行:

    mpiexec --hostfile hostfile.txt -n 2 -x OMP_NUM_THREADS=11 a.out : \
                                    -n 3 -x OMP_NUM_THREADS=12 a.out
    

    将会发生的情况是,a.out 的两个副本将在 node1 上启动,并将成为等级 0 和 1。对于那些,环境变量 OMP_NUM_THREADS 将设置为 11。假设等级 0 是主进程并且它不执行 OpenMP 并行区域,OMP_NUM_THREADS 的值与它无关。否则,您可以通过显式调用omp_set_num_threads(1) 轻松阻止任何OpenMP 代码使用多个线程。 Rank 1 将成为工作人员之一,它将使用并行区域中的 11 个线程。在其余节点上,只会启动一个 MPI 进程,OMP_NUM_THREADS 的值将设置为 12,因此 OpenMP 运行时将使用所有 CPU。这些进程将成为 2、3 和 4 级。工人 1 会慢一些,但你已经说过你的工作项需要可变时间才能完成,所以我猜是内置了某种工作平衡器。

    您还可以为 0 级创建主/从混合。您可以:

    • 在不同的线程中运行主代码和工作代码。这将使主代码复杂化,因为这个特定的工作人员将不得不通过不同的机制获得工作,例如。通过共享内存队列或其他东西,而不是其他工作人员。也可以让 mater 向自己发送消息,但是这将需要一个能够MPI_THREAD_MULTIPLE 的 MPI 实现,这通常会带来其他问题,主要是性能问题。
    • 将主代码与工作代码融合在一起,尤其是当工作代码执行某种循环时。在这种特定情况下,您可以发布工作结果的非阻塞接收,然后在工作循环的每次迭代中使用MPI_Test 来确定结果消息是否已到达。如果是这样,运行主循环的一次迭代,发布一个新的非阻塞接收并继续工作迭代。或者使用MPI_Iprobe 而不是非阻塞接收。

    两者都会显着增加代码的复杂性,而第二个则完全打乱了主/从代码分离。我宁愿坚持上面的明显解决方案。

    【讨论】:

    • 如果我提交到大型系统,如何获取节点名称?如果有 500 个节点,我只要求说 25 个,哪些将由系统调度程序确定...
    • 这取决于使用的批处理系统。有些允许您请求特定的插槽分配。其他人会在环境变量中提供主机文件的名称或整个主机列表。您可以编写一个脚本将它们转换为适当的 MPI 主机文件。
    猜你喜欢
    • 2015-03-26
    • 2012-10-20
    • 1970-01-01
    • 2015-12-13
    • 2013-02-17
    • 2013-11-15
    • 2016-02-08
    • 2016-02-15
    • 2019-01-15
    相关资源
    最近更新 更多