cFu_time () из gFortran возвращает время пользователя, системное время или сумму обоих? - PullRequest
1 голос
/ 15 марта 2011

Мне нужно время, чтобы сравнить производительность кода на Fortran Vs C.В CI можно получать как пользовательское, так и системное время независимо друг от друга.

При использовании gFortran cpu_time() что он представляет?

С помощью компилятора Фортрана IBM можно выбрать, что выводить, установив средупеременная (см. CPU_TIME () ) В документации gFortran .

я не нашел ссылки на что-то подобное.системное время или сумма обоих?

Ответы [ 4 ]

2 голосов
/ 15 марта 2011

Gfortran CPU_TIME возвращает сумму пользовательского и системного времени.

В MINGW он использует GetProcessTimes (), на других платформах getrusage () или, если getrusage () недоступен, times ().

См.

http://gcc.gnu.org/git/?p=gcc.git;a=blob;f=libgfortran/intrinsics/cpu_time.c;h=619f8d25246409e0f32c96299db724213aa62b45;hb=refs/heads/master

и

http://gcc.gnu.org/git/?p=gcc.git;a=blob;f=libgfortran/intrinsics/time_1.h;h=12d79ebc12fecf52baa0895c7ab8accc41dab500;hb=refs/heads/master

FWIW, если вы хотите измерить время настенного таймера, а не время процессора, пожалуйста, используйте встроенную функцию SYSTEM_CLOCK вместо CPU_TIME.

1 голос
/ 15 марта 2011

Если вам нужно время на стене, вы можете использовать date_and_time, http://gcc.gnu.org/onlinedocs/gcc-4.0.2/gfortran/DATE_005fAND_005fTIME.html

Я не уверен, насколько он стандартен, но по моему опыту он работает как минимум на четырех разных платформах, включая экзотическиеCray конструкции.

Одна вещь здесь - заботиться о полуночи, вот так:

character*8  :: date            
character*10 :: time
character*5  :: zone
integer :: tvalues(8)
real*8 :: time_prev, time_curr, time_elapsed, time_limit

integer :: hr_curr, hr_prev

! set the clock
call date_and_time(date, time, zone, tvalues)

time_curr = tvalues(5)*3600.d0 + tvalues(6)*60.d0 + tvalues(7)  ! seconds 
hr_curr = tvalues(5)
time_prev=0.d0; time_elapsed = 0.d0; hr_prev = 0

!... do something...

time_prev = time_curr; hr_prev = hr_curr
call date_and_time(date, time, zone, tvalues)
time_curr = tvalues(5)*3600.d0 + tvalues(6)*60.d0 + tvalues(7)  ! seconds 
hr_curr = tvalues(5)
dt = time_curr - time_prev
if( hr_curr < hr_prev )dt = dt + 24*3600.d0   ! across the midnight

time_elapsed = time_elapsed + dt
1 голос
/ 15 марта 2011

мое предположение: общее пользовательское и системное время, иначе было бы упомянуто?Вероятно, зависит от ОС в любом случае, может быть, не все из них делают различие.Насколько я знаю, процессорное время - это время, которое ОС назначает вашему процессу, будь то в пользовательском режиме или в режиме ядра, выполняемом от имени процесса.

Для вас важно иметь это различие?

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

0 голосов
/ 15 марта 2011

@ Emanual Ey.Пользовательское время процессора + системное время процессора должно равняться времени процессора.Истекшее, реальное или «настенное время» должно быть больше, чем общее время зарядки процессора.Чтобы измерить время на стене, лучше всего ввести команду времени до и после сложной части.Тьфу, я сделаю это более сложным, чем должно быть.Не могли бы вы прочитать часть на Время вашего приложения на странице руководства Intel (вы должны найти «Сроки вашего приложения» в индексе)Следует прояснить несколько вещей.

Как я уже говорил, это касается Intel.У меня нет доступа к компилятору gfortran.

...