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

Computing usage of independent cores and binding a process to a core

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

driver_file -> 启动一个进程,检查可用进程是否超过 10 个。如果可用进程超过 10 个,则它会启动一个进程实例,并将特定的 _param 值作为参数传递给 coupling_file

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

trial_file -> 计算工作,returns 值到 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 发起。但是,如果我将进程绑定到一个核心,我不希望同一个核心有 two/more 个进程。比如,我不希望 _coupling_1_trial_1 到核心 x 上的 运行,然后我启动另一个 coupling_2 进程,它启动 _trial_2 也绑定到核心 x

如有任何意见,我们将不胜感激。谢谢!

如果您可以选择,我会完全放弃生成进程,而是一次启动所有进程。 然后,您可以轻松地将它们划分为处理单个任务的块。例如,您的概念的翻译可以是:

  • 使用一位大师(排名 0)
  • 将其余的分成 10 个进程组,如果需要可以为每个组创建一个新的通信器,每个组有一个领导进程,为 master 所知。

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

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* 检测到进程组的可用性,尽管您可能想更改上面的逻辑,以便在任务结束时通知 master,以便它只发送新数据,而不是在之前的试验期间仍然运行,另一个进程组可能会更快。并解决了固定问题,因为您有固定数量的进程,可以在通常的启动期间正确固定。