Я сейчас пользуюсь

ронометраже программы на Фортране я обычно просто использую командуcall cpu_time(t).
Потом я наткнулсяcall system_clock([count,count_rate,count_max]) который, кажется, делает то же самое. Однако в более сложной усадьбе. Мои знания об этом приходят из:Старая документация Intel.
Я не смог найти его на домашней странице Intel. Смотрите мою разметку ниже.

Что является более точным, или они похожи?Один из них считает ошибки кэша (или другие виды), а другой нет, или делает любой из них?Или единственная разница заключается в том, что в моей разметке есть пометка?

Это мои вопросы, ниже я предоставил код для вас, чтобы увидеть некоторые сроки и способы использования. Они показали мне, что они очень похожи по выходу и, следовательно, похожи по реализации.
Я должен отметить, что я, вероятно, всегда буду придерживатьсяcpu_timeи что мне действительно не нужны более точные сроки.

В приведенном ниже коде я попытался сравнить их. (Я также попробовал более сложные вещи, но не буду поставлять, чтобы сохранить краткость). Итак, в основном мой результат таков:

cpu_time
Это проще в использовании, вам не нужны вызовы инициализацииПрямое время в разницеДолжен также зависеть от компилятора, но нет способа увидеть точность. (норма - миллисекунды)Сумма времени потока. То есть не рекомендуется для параллельных прогонов.system_clock
Требуется предварительная инициализация.After-process, в форме разделения. (мелочь, но тем не менее разница)Это зависит от компилятора. На моем ПК было найдено следующее:Intel 12.0.4 использует скорость счета 10000, из-заINTEGER точность.GCC-4.4.5 использует 1000, не знаю, как это дифференцируетСклонен к встречеукручениято есть еслиc1 > c2, из-заcount_maxВремя от одного стандартного времени. Таким образом, это даст фактическое время одного потока, а не сумму.

Код:

PROGRAM timer
  IMPLICIT NONE
  REAL :: t1,t2,rate 
  INTEGER :: c1,c2,cr,cm,i,j,n,s
  INTEGER , PARAMETER :: x=20000,y=15000,runs=1000
  REAL :: array(x,y),a_diff,diff

  ! First initialize the system_clock
  CALL system_clock(count_rate=cr)
  CALL system_clock(count_max=cm)
  rate = REAL(cr)
  WRITE(*,*) "system_clock rate ",rate

  diff = 0.0
  a_diff = 0.0
  s = 0
  DO n = 1 , runs
     CALL CPU_TIME(t1)
     CALL SYSTEM_CLOCK(c1)
     FORALL(i = 1:x,j = 1:y)
        array(i,j) = REAL(i)*REAL(j) + 2
     END FORALL
     CALL CPU_TIME(t2)
     CALL SYSTEM_CLOCK(c2)
     array(1,1) = array(1,2)     
     IF ( (c2 - c1)/rate < (t2-t1) ) s = s + 1
     diff = (c2 - c1)/rate - (t2-t1) + diff
     a_diff = ABS((c2 - c1)/rate - (t2-t1)) + a_diff
  END DO

  WRITE(*,*) "system_clock : ",(c2 - c1)/rate
  WRITE(*,*) "cpu_time     : ",(t2-t1)
  WRITE(*,*) "sc < ct      : ",s,"of",runs
  WRITE(*,*) "mean diff    : ",diff/runs
  WRITE(*,*) "abs mean diff: ",a_diff/runs
END PROGRAM timer

В завершение я приведу вывод моего компилятора Intel 12.0.4 и gcc-4.4.5.

Intel 12.0.4 с участием-O0

system_clock rate    10000.00    
system_clock :    2.389600    
cpu_time     :    2.384033    
sc < ct      :            1 of        1000
mean diff    :   4.2409324E-03
abs mean diff:   4.2409897E-03

real    42m5.340s
user    41m48.869s
sys 0m12.233s

gcc-4.4.5 с участием-O0

system_clock rate    1000.0000    
system_clock :    1.1849999    
cpu_time     :    1.1840820    
sc < ct      :          275 of        1000  
mean diff    :   2.05709646E-03  
abs mean diff:   2.71424348E-03  

real    19m45.351s  
user    19m42.954s  
sys 0m0.348s  

Спасибо за чтение...

Ответы на вопрос(4)

Ваш ответ на вопрос