2016-05-13 2 views
-1

J'ai besoin de référencer une partie d'un programme fortran pour comprendre et quantifier l'impact de changements spécifiques (afin de rendre le code plus maintenable, nous aimerions le rendre plus OO, en profitant des pointeurs de fonction pour Exemple).Benchmarking fortran loop

J'ai une boucle appelant plusieurs fois les mêmes sous-routines pour effectuer des calculs sur des éléments finis. Je veux voir l'impact de l'utilisation de pointeurs de fonction au lieu de simplement des fonctions codées en dur.

do i=1,n_of_finite_elements 
    ! Need to benchmark execution time of this code 
end do 

Quel serait un moyen simple d'obtenir le temps d'exécution d'une telle boucle, et le formater d'une manière nic?

+0

Vous cherchez quelque chose qui profils code ou juste le moment grossière de combien de temps il prend dans son ensemble? Quel système d'exploitation et compilateur utilisez-vous? Pour un moyen simple de vérifier les choses à la main, voir ['CPU_TIME'] (https://gcc.gnu.org/onlinedocs/gfortran/CPU_005fTIME.html). Aussi [cette question] (http://scicomp.stackexchange.com/questions/6812/fortran-best-way-to-time-sections-of-your-code) pourrait être utile. – Gabe

+1

@Gabe Veuillez ne pas utiliser 'CPU_TIME'. Il n'est pas vraiment adapté à la mesure du temps, en particulier en [programmation parallèle] (https://stackoverflow.com/questions/25465101/fortran-parallel-programming). Au lieu de cela, utilisez 'SYSTEM_CLOCK'. –

+0

Bien dans l'ensemble du calendrier, mais l'analyse comparative est (je l'espère) pas seulement de prendre note de l'heure du système. Par exemple, le [benchmark ruby] (http://ruby-doc.org/stdlib-1.9.3/libdoc/benchmark/rdoc/Benchmark.html) fournit des métriques intéressantes telles que l'utilisateur, le système et le temps total. bon affichage, et explique même les précautions à prendre lors de l'analyse comparative. –

Répondre

2

J'ai un projet github qui mesure les performances des différents tableaux qui passent à https://github.com/jlokimlin/array_passing_performance.git

Il utilise le type de données dérivées de CpuTimer de https://github.com/jlokimlin/cpu_timer.git.

Utilisation:

use, intrinsic :: iso_fortran_env, only: & 
    wp => REAL64, & 
    ip => INT32 

use type_CpuTimer, only: & 
    CpuTimer 

type (CpuTimer) :: timer 
real (wp)  :: wall_clock_time 
real (wp)  :: total_processor_time 
integer (ip) :: units = 0 ! (optional argument) = 0 for seconds, or 1 for minutes, or 2 for hours 

! Starting the timer 
call timer%start() 

do i = 1, n 

    !...some big calculation... 

end do 

! Stopping the timer 
call timer%stop() 

! Reading the time 
wall_clock_time = timer%get_elapsed_time(units) 

total_processor_time = timer%get_total_cpu_time(units) 

! Write time stamp to standard output 
call timer%print_time_stamp() 

! Write compiler info to standard output 
call timer%print_compiler_info() 
+0

C'est intéressant et peut être d'un bon usage, mais couvre à peine tout le large sujet de la question. –

+0

Eh bien c'est en fait quelque chose comme ça que je voulais. Je vais essayer de restreindre ma question pour qu'elle corresponde à la portée de cette réponse, je suppose. –

+0

Dans ce cas, vous pouvez toujours commencer par l'ensemble des procédures intrinsèques standard 'system_clock()' et 'cpu_time()', bien que ce paquet ait plus de fonctionnalités dans un objet. –