2014-03-27 27 views
0

我使用OpenMPI和OpenMP(共享内存)来并行化一段代码。我正在尝试为基准测试和加速目的计算代码,但我不明白omp_get_wtime()和mpi_wtime()之间的差异。当同时使用MPI和共享内存时,omp_get_wtime()和mpi_wtime()之间的区别

这里是我的代码不会随着架构在运行上的轮廓:

我有8个节点,每个有16个处理器。我有128个任务要运行。

我正在测试两种情况,我想知道哪种情况更快。

第一种场景: 我给每个节点1/8的任务(使用OpenMPI),并且对于每个任务,节点使用其16个处理器(使用OpenMP)来完成任务。所以Node0会做Task0,当Task0完成时它会做Task8,当Task8完成时它会做Task16;同时节点1将执行任务1,然后任务9,然后任务15等,直到每个任务完成。我想知道整个过程需要多长时间,并且知道每个任务需要多长时间才能完成(平均而言)会很高兴。

第二个场景:我将128个任务中的每个任务放在单个处理器上(使用MPI)。我只想知道这需要多长时间才能运行,并且再次了解每个处理器完成其工作需要多长时间会很高兴。

基本上我在这里做的是比较MPI + OpenMP与使用MPI进行比较的方式。

我应该使用哪个计时器,两者之间有什么区别?

谢谢!

回答

2

omp_get_wtime()MPI_WTIME之间没有本质区别。两者都是亚秒级的精确挂钟定时器,可以返回自过去某点以来的时间。

double tmr = MPI_Wtime(); 
... 
// routine to be timed 
... 
tmr = MPI_Wtime() - tmr; 
// tmr now holds the elapsed time in seconds 

两个功能是局部的,例如:二者也通过反复调用它们,减去值,例如:

double tmr = omp_get_wtime(); 
... 
// routine to be timed 
... 
tmr = omp_get_wtime() - tmr; 
// tmr now holds the elapsed time in seconds 

或使用相同的方法他们测量调用代码执行的节点上的时间。允许跨所有节点同步MPI_WTIME,但很少有实现可以这样做。它们在所有其他方面应该相当一致,并提供相似的精度(并且在大多数平台上通常都使用相同的OS特定的定时器例程来实现)。绝对不能保证两个定时器在过去具有相同的参考点,因此不应该混合它们,例如,以下是无效代码:

double tmr = MPI_Wtime(); 
... 
tmr = omp_get_wtime() - tmr; 
// tmr now holds the elapsed time in seconds + possibly a constant difference 

我会用最好的MPI_WTIME取决于omp_get_wtime()在具有启用OpenMP的。如果您允许您的程序编译为纯MPI和混合MPI + OpenMP,那么最好不要对OpenMP运行时库进行很多(或任何)调用,或者您必须为该案例提供存根实现当OpenMP未启用时。当然,用于混合代码的存根omp_get_wtime()需要一个预处理器宏:

#define omp_get_wtime MPI_Wtime 
相关问题