Pregunta

Necesito hacer algún momento para comparar el rendimiento de algún código Fortran vs C. En CI puede obtener tiempo de usuario y tiempo del sistema de forma independiente.

Al usar Gfortran's cpu_time() ¿que representa?

Con el compilador Fortran de IBM, uno puede elegir qué emitir configurando una variable de entorno (ver Cpu_time () ) No encontré referencia a algo similar en Documentación de Gfortran.

Entonces, ¿alguien sabe si CPU_Time () de GFORTRAN devuelve el tiempo de usuario, el tiempo del sistema o la suma de ambos?

¿Fue útil?

Solución

GFORTRAN CPU_TIME Devuelve la suma del tiempo del usuario y el sistema.

En Mingw utiliza getProcesSTimes (), en otras plataformas getRUSage () o si getRUSage () no está disponible, Times ().

Ver

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

y

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

FWIW, si desea medir la hora de la luz de pared en lugar del tiempo de la CPU, utilice el system_clock intrínseco en lugar de cpu_time.

Otros consejos

Mi conjetura: ¿el total de tiempo de usuario y sistema, de lo contrario, se mencionaría? Probablemente depende del sistema operativo de todos modos, tal vez no todos hacen la distinción. Hasta donde yo sé, el tiempo de la CPU es el momento en que el sistema operativo asigna a su proceso, ya sea en modo de usuario o en modo núcleo ejecutado en nombre del proceso.

¿Es importante que tengas esa distinción?

Para la comparación de rendimiento, probablemente iría por el tiempo de pared de todos modos, y use el tiempo de la CPU para adivinar cuánto E/S está haciendo al restarlo del tiempo de pared.

Si necesita tiempo de pared, puede usar date_and_time, http://gcc.gnu.org/onlinedocs/gcc-4.0.2/gfortran/date_005fand_005ftime.html

No estoy seguro de qué tan estándar es, pero en mi experiencia funciona en al menos cuatro plataformas diferentes, incluidos los diseños exóticos de cray.

Uno Gotcha aquí es cuidar la medianoche, así:

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

@Manual Ey - En continuación a su comentario en la publicación de @Steeebert - (Lo que sigue es para Intel; no sé si algo difiere en otros compiladores). Tiempo de CPU del usuario + El tiempo de la CPU del sistema debe ser igual al tiempo de la CPU. El tiempo transcurrido, real o "reloj de pared" debe ser mayor que el tiempo total de CPU cargado. Para medir el tiempo de pared, es mejor poner el comando de tiempo, antes y después de la parte difícil. Ugh, voy a hacer esto más complicado de lo que debería ser. ¿Podrías leer la parte en Cronometrar su aplicación en la página del manual de Intel (Tendrá que encontrar la "cronometra de su aplicación" en el índice). Debería aclarar algunas cosas.

Como dije antes, eso va para Intel. No tengo acceso al compilador de Gfortran.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top