由于C中已经有几个定时器,如
time()
、clock()
,我们可以使用C库函数来判断一段代码已经运行了多长时间,例如
start_time=time(NULL);
{...}
end_time=time(NULL);
walltime=end_time-start_time;
如果我想确定每个处理器运行同一段代码所需的实际时间, 我可以使用上面的代码而不是用
time()
替换 MPI_Wtime()
吗?如果方法不对的话
为什么我应该在 MPI 代码中使用 MPI_Wtime()
。我写MPI代码时的time()
和MPI_Wtime()
有什么区别吗?
顺便说一句,我不知道
time()
和 MPI_Wtime()
之间的区别,以及为什么 MPI_Wtime()
存在,因为我们在 C 标准库中已经有一些定时器了。
MPI 旨在支持 C、C++ 和 Fortran。它是在 20 世纪 90 年代创建的,当时 Fortran 还没有对计时器的标准支持(有关特定于实现的选项的一些示例,请参阅 LAPACK 源代码)。
尽管
gettimeofday
存在,但由于其工作方式的要求,它通常非常慢。 MPI 不必提供相同的行为并且可以更快。正如 Gilles 所指出的,MPI_Wtime
返回一个 double
,这通常是用户想要的,而不是包含秒和微秒作为整数的 struct
。
例如,在 IBM Blue Gene/P 系统上,
MPI_Wtime()
从寄存器读取系统时钟。开销为 220 个周期。相比之下,OpenMP 中的 omp_get_wtime()
调用了 gettimeofday
并且开销高出多个数量级(直到我提交了该错误并且 IBM 修复了它)。
顺便说一句,
MPI_Wtime
不会出现time_t
那样的Y2038问题(https://en.wikipedia.org/wiki/Year_2038_problem),直到他们通过破坏ABI来修复它。