Fortran: Cách tốt nhất để các phần thời gian trong mã của bạn?


15

Đôi khi, trong khi tối ưu hóa mã, cần phải có thời gian cho một số phần nhất định của mã, tôi đã sử dụng những điều sau đây trong nhiều năm nhưng tự hỏi liệu có cách nào đơn giản hơn / tốt hơn để làm điều đó không?

call system_clock(count_rate=clock_rate) !Find the time rate
call system_clock(count=clock_start)     !Start Timer

call do_something_subroutine             !This is what gets timed

call system_clock(count=clock_stop)      ! Stop Timer

e_time = real(clock_stop-clock_start)/real(clock_rate)

Câu trả lời:


11

Có một vài cách khác để làm điều này, với những ưu điểm và nhược điểm:

  • MPI_WTIME : Đây là đồng hồ treo tường có độ phân giải cao. Nó có lẽ là tùy chọn 'đáng tin cậy' nhất; nó chỉ hoạt động. Nhược điểm là nếu chương trình của bạn chưa sử dụng MPI, bạn sẽ phải bọc MPI xung quanh nó (điều này không khó).
  • Sử dụng một fortranic (như bạn có): Đây có thể là dễ nhất và nói chung là đủ, nhưng có thể không hoạt động tốt trên một kiến ​​trúc lạ hoặc cho các công việc song song. Có một chút thảo luận về Stack Overflow này
  • Kết thúc cuộc gọi C: Fortran và C tương thích với đối tượng, do đó, đủ dễ dàng để viết một trình bao bọc xung quanh các cuộc gọi C. Một mã tôi làm việc với việc sử dụng getrusage, có thể là một lựa chọn kỳ lạ. Có nhiều cuộc thảo luận về điều này trên Stack Overflow.

Đề xuất cá nhân của tôi sẽ là MPI_WTIME, vì bạn biết nó sẽ hoạt động tốt ở bất cứ nơi nào có MPI. Đây là một ví dụ từ một tìm kiếm nhanh:

  include 'mpif.h'
  DOUBLE PRECISION :: start, end
  start = MPI_Wtime()

  ! code to be timed

  end   = MPI_Wtime()
  write(*,*) 'That took ',end-start,' seconds'

4

Nếu bạn sử dụng trình biên dịch GNU, hãy xem gprof .

Nói tóm lại, bạn sẽ thêm cờ -g vào trình biên dịch của mình, như vậy:

g77 -g -pg -0 myprogram myprogram.F

Sau đó, chạy đầu ra và một tệp có tên gmon.out sẽ hiển thị trong thư mục của bạn. Sau đó gọi

gprof --line myprogram gmon.out

Điều này sẽ cung cấp một hồ sơ thời gian CPU từng dòng.


Cảm ơn câu trả lời tôi chỉ cần làm rõ rằng tôi đang yêu cầu một giải pháp lập trình. Một hồ sơ là tuyệt vời nhưng nó nhiều hơn những gì tôi đã yêu cầu.
Dao động Isopycnal

3
cờ là -pg, -gdành cho các biểu tượng gỡ lỗi (cũng thú vị, nhưng không bắt buộc)
RSFalcon7

Tôi đã nghe nói ở nhiều nơi rằng thời gian được đưa ra bởi gprof không nhất thiết phải chính xác, chẳng hạn như yosefk.com/blog/iêu , stackoverflow.com/questions/1777556/alternigin-to-gprof/ tựa (và nhiều câu trả lời khác của Mike Dunlavey trên Stack Overflow). Các công cụ như gprof và kcachegrind vẫn hữu ích, trong đó số lần gọi hàm vẫn chính xác và chúng cung cấp cho bạn một số dữ liệu thời gian, nhưng tôi sẽ không coi đó là tin lành. DOE có một số công cụ cho việc này, nhưng tôi không biết liệu chúng có tốt hơn việc chèn bộ hẹn giờ hay không.
Geoff Oxberry

1
Nghiêm túc, @IsopycnalOscillation cố gắng sử dụng trình hồ sơ. Đó là một cái gì đó mới để tìm hiểu, nhưng nó sẽ giúp bạn rất nhiều (và dọn sạch mã của bạn!) Về lâu dài.
tmarthal

cảm ơn @tmarthal Tôi đã sử dụng profiler trước đây và tôi chắc chắn sẽ sử dụng một cho dự án tiếp theo của tôi - tôi hoàn toàn đồng ý với những gì bạn nói.
Dao động Isopycnal

2

Như được đề cập bởi icurays1 profiling là tốt nhất. Bạn cũng có thể đơn giản hóa một chút ở trên ...

use utils
...
call tic()
   ! Section to be timed
call toc()
...
call tic()
   ! Section to be timed
call toc()
...

nơi mô-đun utils chứa ...

real(8) :: t1,t2
...
subroutine tic()
  implicit none
  call cpu_time(t1)
end subroutine tic

subroutine toc()
  implicit none
  call cpu_time(t2)
  ! if (rank==0) print*,"Time Taken -->", real(t2-t1)
  print*,"Time Taken -->", real(t2-t1)
end subroutine toc

Nếu bạn có nhiều phần như vậy thì hãy truyền một chuỗi, ví dụ: "part_id" trong toc để nó in id / name cùng với thời gian.


Tôi sẽ đề nghị không thực hiện t1t2toàn cầu, mà thay t1vào đó là một tham số cho cả hai hàm, để cho phép nhiều bộ định thời. Bạn cũng có thể chỉ trả lại thời gian, không in bất cứ điều gì.
Pedro
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.