混合OpenMP / MPI与OpenMP单独运行时间较慢

时间:2017-01-23 15:57:59

标签: c parallel-processing mpi openmp openmpi

我正在编写混合的openMP / MPI代码。 我首先在8个线程上单独标记openMP。 然后,我添加了MPI层,如下所示

MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &numprocs);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Get_processor_name(processor_name, &namelen);
//the following function has OPENMP for loop embedded
parallelfunction(args);//should I add condition on rank?
MPI_finalize();

openMP函数是循环的标准openmp

#pragma omp parallel for schedule(dynamic,chunk) private(i)
for(i=0;i<n;i++){
//loop code here
}

我编译了混合代码并在一个像这样的

上运行它
mpirun -np 1 -x OMP_NUM_THREADS=8 ./program

只知道运行时间比openMP慢5倍(必须在一个CPU上)。 我使用bash time函数对壁垒时间进行基准测试。 有什么建议吗?

我正在使用openmp 3.1和mpicc

编辑

我使用openMPI v1.10.3

1 个答案:

答案 0 :(得分:2)

您尚未明确指定MPI实现,但使用-x将环境变量传递给MPI进程是Open MPI的明显标志。从版本1.8开始,默认情况下启用进程固定/绑定,详见MPI process launcher的手册页:

  

请注意,mpirun会自动绑定v1.8系列启动时的进程。在没有任何进一步指令的情况下使用两种绑定模式:

     

绑定核心:
  当进程数<= 2时   绑定到套接字:
  当进程数> 2

     

如果您的应用程序使用线程,那么您可能希望确保您完全没有绑定(通过指定--bind-to none),或者使用适当的绑定级别或特定数量的处理元素绑定到多个核心申请程序。

在您的情况下,进程绑定到单个核心,并且所有线程都必须在其上分时。 --bind-to none删除绑定并允许在所有CPU核心上调度线程。