примечание: это более подробный комментарий к сообщению Яннеб , чтобы предоставить немного больше информации.
Как указано Яннебом, функция 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 может быть сокращена до команды bash :
$ 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