【问题标题】:slower running time with hybrid OpenMP/MPI vs OpenMP alone混合 OpenMP/MPI 与单独使用 OpenMP 相比运行时间更慢
【发布时间】:2017-01-23 15:57:58
【问题描述】:

我正在编写一段混合的 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 for 循环

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

我编译了混合代码并像这样在一个 CPU 上运行它

mpirun -np 1 -x OMP_NUM_THREADS=8 ./program

只意识到运行时间比单独使用 openMP 慢 5 倍(必须在一个 CPU 上)。 我使用 bash time 函数对挂墙时间进行基准测试。 有什么建议吗?

我正在使用带有 mpicc 的 openmp 3.1

编辑

我使用 openMPI v1.10.3

【问题讨论】:

  • 不看实际代码和实测结果完全无法判断。
  • 确实如此。 1 个 CPU 和 8 个线程。
  • 您显然在使用 Open MPI。尝试将--bind-to none 添加到mpirun 选项列表中。
  • 根据 Zulan 的上述评论,提供内部循环代码和至少运行时。如果在一个 MPI 进程上 OMP+MPI 比单独的 OMP 慢得多,则 MPI 初始化时间对于计算而言是不可忽略的。如果是这样,您的 n 太小而无法进行基准测试。如果n 无法更改,那么您的并行化模型就是错误的。
  • 像往常一样@HristoIliev 拯救了一天!感谢您的大力帮助!

标签: c parallel-processing mpi openmp openmpi


【解决方案1】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-26
    • 2013-11-15
    • 2012-10-20
    • 2013-02-17
    • 2021-03-01
    • 2013-08-27
    • 2017-08-09
    • 2016-02-08
    相关资源
    最近更新 更多