我正在使用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
我面临两个困境,即:
如何评估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启动。但是,如果我将进程绑定到核心,我不希望同一个核心有两个/更多进程。如同,我不希望_trial_1
_coupling_1
x
在核心coupling_2
上运行,然后我启动另一个_trial_2
进程,启动x
也被绑定到核心User Resource Permissions
Edi Plan A [view]
。
任何输入都将不胜感激。谢谢!
答案 0 :(得分:0)
如果它是您的选项,我会完全放弃产生进程的事情,而是立即启动所有进程。 然后,您可以轻松地将它们分区为处理单个任务的块。例如,您的概念的翻译可以是:
在您的代码中,您可以执行以下操作:
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 *可以检测到进程组的可用性,尽管您可能想要更改上面的逻辑,在任务结束时通知主数据,因此它只发送新数据,然后在上一次试用期间尚未运行,而另一个进程组可能会更快。并且固定已解决,因为您有固定数量的进程,可以在正常启动期间正确固定。