【发布时间】: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