2017-04-20 58 views
0

我想调用一个库,该库使用自身通过MPI并行运行的程序中的OpenMP并行化。如果我只使用一个进程来运行我的MPI程序,那么当需要调用OpenMP库时,会有7个附加线程(对应于我的机器上的核心数)正确生成,并且任务将并行执行。如果我在2个进程上运行我的MPI程序,并让每个进程调用OpenMP程序,它们每个都会产生自己的线程,而不像以前一样工作,从而使计算时间更长。在MPI程序中启动OpenMP程序

我试图让MPI主进程在其他进程等待时调用OpenMP库,但这些进程(物理内核)根本不参与OpenMP计算。

我必须告诉MPI程序它现在应该集体启动OpenMP程序吗?另一个复杂的事实是,我在具有多个节点的集群上运行MPI程序。仅在包含MPI主进程的节点上启动OpenMP程序才是可以接受的。

具体来说,我的MPI程序是用Cython编写的,并使用mpi4py。我使用MPICH作为MPI实现,但希望这不重要。 OpenMP程序是用C编写的,我通过Cython包装器调用它。

+3

你的问题很混乱。标题提到了“OpenMP程序”,但是从文本中可以看出您正在调用使用OpenMP的库函数。请澄清,因为两者都是非常不同的东西。 –

+0

您选择的MPI很重要,因为更广泛使用的MPI选择(至少在Linux上)提供了将OpenMP线程固定到独立内核的自动方法。否则,OpenMP进程可能需要在单独的节点上运行,除非您遇到了编写脚本以设置亲和性以及使用支持亲缘关系的OpenMP的麻烦。 – tim18

+0

@HristoIliev我想我正在使用一个使用OpenMP的库。 –

回答

0

我找到了解决方案。

对OpenMP库的调用只能由单个MPI进程完成。在这次调用之后插入标准MPI屏障并不好,因为这样的屏障占用了从属进程的100%的CPU时间,不会为OpenMP库带来额外的劳动力。相反,我们必须编写自己的屏障功能,定期ping主进程以询问OpenMP调用是否已完成。在两个这样的ping之间,从属进程会在给定的时间间隔内休眠,这意味着它们可以自由地参与OpenMP计算。

这个逻辑的一个例子在Python中实现如下,希望具有明显的变量名称的含义。

def sleeping_barrier(sleep_time=0.1): 
    if master: 
     # Signal slaves to continue 
     for slave in range(1, nprocs): 
      isend(True, dest=slave) 
    else: 
     # Wait for master 
     while True: 
      sleep(sleep_time) 
      if iprobe(): 
       recv() # Remember to receive the message 
       break 

# Do OpenMP library call 
if master: 
    call_openmp_lib() 
sleeping_barrier()