计算独立核心的使用并将进程绑定到核心

时间:2015-09-30 16:58:45

标签: parallel-processing mpi schedule

我正在使用MPI,我有一定的操作层次。对于参数_param的特定值,我启动10个试验,每个试验在不同的核心上运行特定的过程。对于n值_param,代码在某个层次结构中运行:

driver_file - > 启动一个进程,检查可用进程是否超过10.如果有超过10个进程,则启动一个进程实例,其中一个特定_param值作为参数传递给coupling_file

coupling_file - > 进行一些基本计算,然后使用MPI_Comm_spawn()启动10个进程,每个进程对应一个trial_file,同时将_trial作为参数传递

trial_file - > 计算工作,将值返回到coupling_file

我面临两个困境,即:

  1. 如何评估driver_file中核心所需的条件? 如何,我如何找出已终止的进程数,以便我可以在空闲核心上正确安排进程?我想可能会添加一个阻塞MPI_Recv()并使用它传递一个变量,它会告诉我某个过程何时完成,但我不确定这是否是最佳解决方案。

  2. 如何确保将流程分配给不同的核心?我曾想过使用类似mpiexec --bind-to-core --bycore -n 1 coupling_file的东西来启动一个coupling_file。接下来会出现mpiexec --bind-to-core --bycore -n 10 trial_file之类的内容 由coupling_file启动。但是,如果我将进程绑定到核心,我不希望同一个核心有两个/更多进程。如同,我不希望_trial_1 _coupling_1 x在核心coupling_2上运行,然后我启动另一个_trial_2进程,启动x也被绑定到核心User Resource Permissions Edi Plan A [view]

  3. 任何输入都将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:0)

如果它是您的选项,我会完全放弃产生进程的事情,而是立即启动所有进程。 然后,您可以轻松地将它们分区为处理单个任务的块。例如,您的概念的翻译可以是:

  • 使用一个主人(等级0)
  • 将其余部分划分为10个进程的组,如果需要,可以为每个组创建一个新的通信器,每个组都有一个主要进程的引导进程。

在您的代码中,您可以执行以下操作:

if master:
    send a specific _param to each group leader (with a non-blocking send)
    loop over all your different _params
        use MPI_Waitany or MPI_Waitsome to find groups that are ready
else
    if groupleader:
        loop endlessly
            MPI_Recv _params from master
            coupling_file
            MPI_Bcast to group
            process trial_file
    else
        loop endlessly
            MPI_BCast (get data from groupleader)
            process trial file

我认为,遵循这种方法可以让您解决两个问题。 MPI_Wait *可以检测到进程组的可用性,尽管您可能想要更改上面的逻辑,在任务结束时通知主数据,因此它只发送新数据,然后在上一次试用期间尚未运行,而另一个进程组可能会更快。并且固定已解决,因为您有固定数量的进程,可以在正常启动期间正确固定。