我想调用一个在程序中使用OpenMP并行化的库,该程序本身通过MPI并行运行。如果我只使用一个进程运行我的MPI程序,那么当需要调用OpenMP库时,会正确生成7个额外的线程(对应于我机器上的核心数),并且任务是并行执行的。如果我改为在2个进程上运行我的MPI程序并让每个进程调用OpenMP程序,那么每个进程都会生成自己的线程,而不是像以前那样一起工作,这使得计算需要更长的时间。
我试图让MPI主进程调用OpenMP库,而其他进程等待,但这些进程(物理内核)根本不参与OpenMP计算。
我是否必须以某种方式告诉MPI程序它现在应该集体启动OpenMP程序?更复杂的是我在具有多个节点的集群上运行MPI程序。只在包含MPI主进程的节点上启动OpenMP程序是可以接受的。
具体来说,我的MPI程序是用Cython编写的,并使用mpi4py。我使用MPICH作为MPI实现,但希望这并不重要。 OpenMP程序是用C语言编写的,我通过Cython包装器调用它。
答案 0 :(得分:0)
我找到了解决方案。
对OpenMP库的调用只能由单个MPI进程完成。在此调用之后插入标准MPI屏障是没有好处的,因为这样的屏障占用了从属进程100%的CPU时间,从而不会为OpenMP库提供额外的工作量。相反,我们必须编写自己的屏障函数,定期ping主进程以询问OpenMP调用是否已完成。在两个这样的ping之间,slave进程在给定的时间间隔内休眠,这意味着它们可以自由参与OpenMP计算。
这个逻辑的一个例子在Python中实现如下,希望具有变量名称的明显含义。
/dist