计算独立核心的使用情况并将进程绑定到核心
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
我面临两个困境,即:
如何评估 driver_file 中核心的所需条件?
比如,我如何找出有多少进程已终止,以便我可以在空闲核心上正确安排进程?我想也许可以添加一个阻塞 MPI_Recv()
并用它来传递一个变量,该变量会告诉我某个进程何时完成,但我不确定这是否是最佳解决方案。
如何确保进程分配给不同的核心?我曾考虑过使用 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,以便它只发送新数据,而不是在之前的试验期间仍然运行,另一个进程组可能会更快。并解决了固定问题,因为您有固定数量的进程,可以在通常的启动期间正确固定。
我正在使用 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
我面临两个困境,即:
如何评估 driver_file 中核心的所需条件? 比如,我如何找出有多少进程已终止,以便我可以在空闲核心上正确安排进程?我想也许可以添加一个阻塞
MPI_Recv()
并用它来传递一个变量,该变量会告诉我某个进程何时完成,但我不确定这是否是最佳解决方案。如何确保进程分配给不同的核心?我曾考虑过使用
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,以便它只发送新数据,而不是在之前的试验期间仍然运行,另一个进程组可能会更快。并解决了固定问题,因为您有固定数量的进程,可以在通常的启动期间正确固定。