我的代码中有一些子例程,我需要测量它们的执行时间。假设在极端情况下,例程每秒调用 10-100 次。在Fortran中有很多方法可以测量时间,但是由于调用的频率,我需要产生最低开销的方法。
时间测量本身不需要超级准确,因为我对子例程需要几毫秒或更短的时间不感兴趣,而是当它们峰值到 50 毫秒或更长时间时(这是我需要采取反作用并在内部重新平衡某些事情的时候)。
代码使用 MPI+OpenMP 并行化,所以MPI_Wtime()
最简单的方法,但我想这个代码的成本相当大?我对一个好的解决方案的猜测是system_clock()
.有谁知道每秒调用 50-100 次是否"安全"(性能方面)?
system_clock
可能比cpu_time
便宜得多,并且精度要好得多。
对于 Linux 上的 GFortran,我依稀记得我曾经通过循环调用它进行测试,system_clock
每次调用大约 50 ns。
system_clock
是clock_gettime(CLOCK_MONOTONIC, ...)
的包装器(在 Linux 上使用 vDSO,而不是真正的系统调用,所以它非常非常快),libgomp(GFortran 使用的 OpenMP 运行时库)中omp_get_wtime
也是如此,因此两者的性能应该或多或少相同。
我不确定MPI_Wtime
如何在常见的 MPI 实现上实现,但如果它是相同的,我不会感到惊讶。