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