我正在使用MPI,并且我有一个特定的操作层次。对于参数_param的特定值,我启动了10次试验,每次在不同的核心上运行特定的进程。对于_param的n个值,代码在特定层次结构中运行,如下所示:
driver_file ->启动一个进程,检查可用进程是否超过10个。如果可用进程超过10个,则启动一个具有特定_param值的进程实例,该实例作为参数传递给coupling_file。
coupling_file ->进行一些基本计算,然后使用MPI_Comm_spawn()启动10个进程,每个进程对应于一个trial_file,同时将_trial作为参数传递。
trial_file ->计算工作,将值返回给coupling_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 of _coupling_1在核心x上运行,然后启动另一个coupling_2进程,它启动_trial_2,该进程也绑定到核心x。如有任何意见,将不胜感激。谢谢!
发布于 2015-09-30 20:14:48
如果这是你的选择,我会完全放弃产卵过程,而是一次启动所有进程。然后,您可以轻松地将它们划分为处理单个任务的块。例如,对你的概念的翻译可以是:
然后,在您的代码中,您可以执行如下操作:
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*会检测到进程组的可用性,尽管您可能希望更改上面的逻辑,以便在任务结束时通知主进程,以便它只发送新数据,而不是在上一次试用期间仍在运行,而另一个进程组可能更快。固定是解决的,因为你有固定数量的进程,可以正确地固定在通常的启动。
https://stackoverflow.com/questions/32871781
复制相似问题