我正在使用OpenMPI和OpenMP(共享内存)来并行化一段代码。我正在尝试将该代码用于基准测试和加速目的,并且我不理解omp_get_wtime()和mpi_wtime()之间的差异。
以下是我的代码与其运行的体系结构一起做的概述:
我有8个节点,每个节点有16个处理器。我有128个任务要运行。
我正在测试两种情况,我想知道哪种情况更快。
第一种情况: 我给每个节点提供了1/8的任务(使用OpenMPI),并且对于每个任务,节点使用其16个处理器(使用OpenMP)来完成任务。所以Node0会做Task0,当Task0完成它会做Task8,当Task8完成它会做Task16;同时Node1将执行Task1,然后执行Task9,然后执行Task15等,直到每个任务完成。我想知道整个过程需要多长时间,并且知道每个任务完成所需的时间(平均)会很好。
第二种情况:我将128个任务中的每一个放在一个处理器上(使用MPI)。我只是想知道这需要多长时间才能运行,而且再次知道每个处理器完成其工作需要多长时间会很好。
基本上我在这里做的是比较MPI + OpenMP与我的代码只使用MPI的比较。
我应该使用哪个计时器,两者之间有什么区别?
谢谢!
答案 0 :(得分:2)
omp_get_wtime()
和MPI_WTIME
之间没有任何主要差异。两者都是亚秒级精密挂钟定时器,可以返回自过去某个时间点开始经过的时间。两者也通过重复调用它们并减去值来以相同的方式使用,例如:
double tmr = omp_get_wtime();
...
// routine to be timed
...
tmr = omp_get_wtime() - tmr;
// tmr now holds the elapsed time in seconds
或:
double tmr = MPI_Wtime();
...
// routine to be timed
...
tmr = MPI_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