2015-09-30 35 views
0

我正在使用MPI,并且我有一定的操作层次结构。对于参数_param的特定值,我会启动10个试验,每个试验在不同的核心上运行特定的过程。对于_param n个值,该代码在一定的层次结构形式运行:计算独立内核的使用情况并将进程绑定到内核

driver_file - > 启动一个方法,该方法检查是否可用的方法是超过10个。如果多于10是可用的,则它启动的一个实例与作为参数传递的特定_param值过程coupling_file

coupling_file - > 做一些基本的计算,并且然后启动使用MPI_Comm_spawn() 10点的过程,每一个对应于trial_file同时使_trial作为参数

trial_fil Ë - > 计算工作,返回值,我面临两个难题,即coupling_file

  1. 如何评估在driver_file核心所要求的条件? 和我一样,如何找出有多少进程已被终止,以便我可以在空闲内核上正确调度进程?我想也许增加一个阻塞MPI_Recv()并使用它来传递一个变量,它会告诉我某个进程何时完成,但我不确定这是否是最佳解决方案。

  2. 如何确保将进程分配给不同的内核?我曾考虑过使用诸如mpiexec --bind-to-core --bycore -n 1 coupling_file之类的东西来启动一个coupling_file。接下来是由coupling_file启动的类似mpiexec --bind-to-core --bycore -n 10 trial_file 。但是,如果我对一个核心进行绑定,我不希望同一个核心拥有两个/多个进程。因为我不想要_trial_1_coupling_1在核心x上运行,那么我启动coupling_2的另一个过程,该过程启动_trial_2,该过程也被绑定到核心x

任何输入,将不胜感激。谢谢!

+0

因为你需要一个固定的进程数量,为什么不用mpiexec启动所有的进程,然后把任务交给他们呢?您可能需要在客户端服务器处理中添加一些逻辑,但是您将摆脱产卵,并且可以正确固定所有进程。 – haraldkl

回答

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 *检测到进程组的可用性,尽管您可能想要更改上述逻辑,以便在任务结束时通知主服务器,以便只发送新数据,然后在之前的试用期间还没有运行,而另一个进程组可能会更快。并且固定已解决,因为您有固定数量的进程,可以在通常的启动过程中正确固定进程。

+0

你可以提出任何方法来安排MPI进程,以便一个进程只在运行时占用一个内核,否则不会。的进程是否超过内核的数量?我想要一个进程在一个内核上运行,完成自己,然后运行另一个进程,而不是在一个内核上运行两个进程,并在两个进程之间切换上下文。并感谢您的解决方案! – micawber

+0

@micawber对不起,从来没有动态产卵和终止过程,所以我不知道。我使用MPI的方式是启动与核心数量相匹配的固定数量的进程,然后在这些进程中工作,可能具有不同的角色。也许别人有答案。 – haraldkl