Синхронизация многопоточной программы на Фортране - PullRequest
3 голосов
/ 22 февраля 2011

У меня есть программа на Fortran 90, вызывающая многопоточную подпрограмму.Я хотел бы отдалить эту программу от рутины вызова.Если я использую cpu_time(), я получаю cpu_time для всех потоков (в моем случае 8), а не фактическое время, необходимое для запуска программы.Кажется, что процедура etime() делает то же самое.Любая идея о том, как я могу рассчитать время этой программы (без использования секундомера)?

Ответы [ 2 ]

5 голосов
/ 22 февраля 2011

Попробуйте omp_get_wtime();см. http://gcc.gnu.org/onlinedocs/libgomp/omp_005fget_005fwtime.html для подписи.

2 голосов
/ 23 февраля 2011

Если это одноразовая вещь, то я согласен с Ларсманами, что использование gprof или какого-либо другого профилирования - это, вероятно, путь;но я также согласен с тем, что очень удобно иметь в коде более грубые таймеры для синхронизации различных этапов вычислений.Лучшая информация о времени, которую вы имеете, - это то, что вы на самом деле используете, и трудно превзойти то, что выводится каждый раз, когда вы запускаете свой код.

Джеремия Уилкок, указывая на omp_get_wtime(), очень полезна;он соответствует стандартам, поэтому должен работать на любом компиляторе OpenMP - , но у него есть только второе разрешение, которого может быть или не быть достаточно, в зависимости от того, что вы делаете . Отредактировано ;вышеприведенное было совершенно неверно.

Fortran90 определяет system_clock(), который также может использоваться на любом совместимом со стандартами компиляторе;Стандарт не определяет временное разрешение, но кажется, что это миллисекунды, а 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
...