我有一个调用多线程例程的Fortran 90程序。我想从调用例程中调用这个程序。如果我使用cpu_time()
,我最终将所有线程的cpu_time(本例中为8)加在一起,而不是程序运行所需的实际时间。 etime()
例程似乎也这样做。任何想法如何我可以计时这个程序(不使用秒表)?定时一个Fortran多线程程序
3
A
回答
4
尝试omp_get_wtime()
;请参阅http://gcc.gnu.org/onlinedocs/libgomp/omp_005fget_005fwtime.html的签名。
2
如果这是一次性的事情,那么我同意larsmans,使用gprof或其他分析方法可能是一种可行的方法;但我也同意,它是很方便在您的代码中有更粗略的计时器来计算不同阶段的计算。您拥有的最佳时机信息是您实际使用的内容,并且很难击败运行代码的每一个输出内容。
耶利米威尔考克指出omp_get_wtime()
是非常有用的;它符合标准,因此可以在任何OpenMP编译器上工作 -
但它只有第二种分辨率,根据您在做什么
,这可能会或可能不够。 编辑;以上是完全错误的。
Fortran90定义了system_clock()
,它也可用于任何符合标准的编译器;该标准没有规定时间分辨率,但gfortran似乎是毫秒,而ifort似乎是微秒。我通常用它是这样的:
subroutine tick(t)
integer, intent(OUT) :: t
call system_clock(t)
end subroutine tick
! returns time in seconds from now to time described by t
real function tock(t)
integer, intent(in) :: t
integer :: now, clock_rate
call system_clock(now,clock_rate)
tock = real(now - t)/real(clock_rate)
end function tock
和使用它们:
call tick(calc)
! do big calculation
calctime = tock(calc)
print *,'Timing summary'
print *,'Calc: ', calctime
+0
omp_get_wtime()返回秒数作为双精度数,所以亚秒分辨率肯定是可能的。借助GCC,如果平台支持高分辨率定时器,则可提供毫微秒分辨率。 – janneb 2011-02-23 06:41:19
相关问题
- 1. 在Fortran中的另一个Fortran程序中调用Fortran程序77
- 2. 暂停/执行多线程程序中的一个线程(C#)
- 3. 的Fortran:如何让多个程序共享同一个程序界面
- 4. 越来越构建一个FORTRAN程序
- 5. 如何创建多个线程池(即多个执行程序,每个线程池都有一个线程)
- 6. 在多线程程序中执行另一个程序
- 7. 可以从一个线程使用System.Threading.Timer启动多少个线程(定时器)?
- 8. FORTRAN - 子程序
- 9. 线程多次加入()一个线程
- 10. 多线程程序
- 11. 从Fortran例程调用多线程(openmp)C++例程
- 12. 多线程程序的测量时间
- 13. 多线程时需要多少个处理程序
- 14. 线程绑定多个gridview
- 15. 锁定多个线程
- 16. 应用程序内的多个线程
- 17. java多线程应用程序:正在线程阻塞时间
- 18. 多线程程序中完成线程的实时输出(CompletionService)
- 19. 多线程应用程序,即时创建新线程?
- 20. Fortran程序错误
- 21. Openmp Fortran子程序
- 22. 一个线程定时快于其他
- 23. C++使用一个线程定时器
- 24. Android定时器只有一个线程
- 25. 一个画布,多线程
- 26. 多线程一个jsp?
- 27. Android处理程序,定时器和多线程
- 28. 我在为多线程程序创建第二个线程时遇到问题
- 29. 一个线程在iPhone应用程序中杀死另一个线程(两个线程都是主线程)?
- 30. 调试多线程程序
`gprof`? `time`? – 2011-02-22 19:43:14