2017-01-23 133 views
-1

我正在编写混合openMP/MPI代码段。 我首先在8个线程上对openMP单独进行了标记。 然后,我加入像下面混合OpenMP/MPI与OpenMP单独运行时间较慢

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的功能的MPI层是用于循环标准的openmp

#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函数对墙壁时间进行基准测试。 有什么建议吗?

我使用OpenMP 3.1 mpicc

编辑

我用了openmpi v1.10.3

+0

如果没有看到实际的代码和实际的测量结果是完全不可能的。 – Zulan

+0

是的。 1个CPU和8个线程。 – Marouen

+2

您明确使用Open MPI。尝试在'mpirun'选项列表中添加'--bind-to none'。 –

回答

2

您没有明确指定MPI实现,但使用-x环境变量传递给MPI过程是Open MPI的一个信号标志。

请注意的mpirun自动绑定程序为V1.8系列的开始的:与1.8版本,工艺钉扎启动/绑定默认情况下,详细的MPI process launcher的手册页启用。

绑定到核心:
时的进程数为< = 2
绑定到插座:
时的进程数为两个结合图案在没有任何进一步指示的使用> 2

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

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

+0

不幸的是,在openmpi 2.1.1版本中我不工作! – niceman