Время исполнения фортрана - PullRequest
       8

Время исполнения фортрана

0 голосов
/ 11 сентября 2018

Я новичок в Фортране и хотел бы попросить о помощи. Мой код очень прост. Он просто входит в цикл, а затем с помощью системной встроенной процедуры вводит файл с кодом имени и запускает программу evalcode.x.

program subr1
  implicit none
  integer :: i,
  real    ::  T1,T2 

  call cpu_time(T1)
  do i=1,6320
    call system ("cd ~/code; ../evalcede/source/evalcode.x test ")
  enddo
  call cpu_time(T2)

  print *, T1,T2

end program subr1

Время, за которое программа фактически выполняется, составляет 0,5 секунды, но время, необходимое для выполнения этого кода, составляет 1,5 часа! Программа приостановлена ​​или ожидает, и я не знаю, почему.

Ответы [ 2 ]

0 голосов
/ 11 сентября 2018

примечание: это более подробный комментарий к сообщению Яннеб , чтобы предоставить немного больше информации.

Как указано Яннебом, функция CPU_TIME не обязательно возвращает время настенных часов , что вы ищете.Это особенно важно при вызовах системы синхронизации.

Кроме того, вывод CPU_TIME действительно зависит от процессора и компилятора.Чтобы продемонстрировать это, следующий код скомпилирован с помощью gfortran, ifort и solaris-studio f90:

program test_cpu_time
  real    ::  T1,T2 
  call cpu_time(T1)
  call execute_command_line("sleep 5")
  call cpu_time(T2)
  print *, T1,T2, T2-T1
end program test_cpu_time

#gfortran>]   1.68200000E-03   1.79799995E-03   1.15999952E-04
#ifort   >]  1.1980000E-03  1.3410000E-03  1.4299992E-04
#f90     >] 0.0E+0 5.00534 5.00534

Здесь вы видите, что и gfortran, и ifort исключают время команды системы, в то время как Solaris-studio включаетвремя.

В общем, нужно видеть разницу между выводом двух последовательных вызовов на CPU_TIME как время, потраченное ЦП на выполнение действий.Из-за системного вызова процесс фактически находится в спящем состоянии во время выполнения и, таким образом, процессорное время не тратится.Это видно по простому ps:

$ ps -O ppid,nlwp,psr,stat $(pgrep sleep) $(pgrep a.out)
  PID  PPID NLWP PSR STAT S TTY          TIME COMMAND
27677 17146    1   2 SN+  S pts/40   00:00:00 ./a.out
27678 27677    1   1 SN+  S pts/40   00:00:00 sleep 5
  • NLWP указывает, сколько потоков используется
  • PPID указывает родительский PID
  • STAT указывает 'S'для прерывистого сна (ожидание завершения события)
  • PSR - это процессор / поток, на котором он работает.

Вы заметили, что основная программаa.out находится в спящем режиме, и системный вызов, и основная программа работают на разных ядрах.Поскольку основная программа находится в спящем режиме, CPU_TIME на этот раз не будет работать.

Примечание: Solaris-studio - странная утка, но опять же, это студия Solaris!


Общий комментарий: CPU_TIME все еще полезен для определения времени выполнения сегментов кода.Это не полезно для синхронизации внешних программ.Для этого существуют и другие более специализированные инструменты, такие как time: Программа OP может быть сокращена до команды :

$ time ( for i in $(seq 1 6320); do blabla; done )

Это то, что стандарт должен сказатьCPU_TIME(TIME)

CPU_TIME(TIME)

Описание: Возвращает время процессора.

Примечание: 13.9: Процессор, для которого один результат неадекватен (например, параллельный процессор), может выбрать дополнительную версию, для которой время является массивом.

Точное определение времениоставлено неточным из-за изменчивости, которую могут предоставить разные процессоры. Основная цель состоит в том, чтобы сравнить различные алгоритмы на одном и том же процессоре или определить, какие части вычисления являются самыми дорогими.

Время начала остается неточным, посколькуЦель состоит в том, чтобы синхронизировать фрагменты кода, как в примере.

Большинство компьютерных систем имеют несколько концепций времени.Одна общая концепция - это время, затрачиваемое процессором на данную программу.Это может включать или не включать системные издержки и не имеет явной связи с истекшим временем «настенных часов».

источник: Стандарт Fortran 2008, Раздел13.7.42

Кроме того:

Процессор зависит от того, вернутся ли результаты, полученные из CPU_TIME, DATE_AND_TIME и SYSTEM_CLOCK зависят от того, какое изображение вызывает их.

Примечание 13.8: Например, не указано , возвращает ли CPU_TIME изображение илизначение для каждой программы, все ли изображения выполняются в одном и том же часовом поясе и одинаковы ли начальный счет, скорость счета и максимум в SYSTEM_CLOCK для всех изображений.

source: Стандарт Фортран 2008, раздел 13.5

0 голосов
/ 11 сентября 2018

Встроенные CPU_TIME измеряют процессорное время, затрачиваемое самой программой, не считая ее подпроцессов (1).

Видимо, большую часть времени тратится на evalcode.x, что объясняет, почему сообщается о настенных часахвремя намного выше.

Если вы хотите измерить временные интервалы настенных часов в Фортране, вы можете использовать SYSTEM_CLOCK intrinsic.

(1) Ну, это то, что делает GFortran, по крайней мере.Стандарт не уточняет, что именно он означает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...