2016-05-13 5 views
-1

Мне нужно проверить часть программы fortran, чтобы понять и количественно оценить влияние конкретных изменений (чтобы сделать код более удобным для обслуживания, мы хотели бы сделать его более OO, воспользовавшись указателями функций для пример).Бенчмаркинг fortran loop

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

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

Что было бы простым способом получить время выполнения такого цикла и отформатировать его в идеальном режиме?

+0

Вы ищете что-то, что профили код или просто грубый выбор времени, сколько времени занимает в целом? Какую ОС и компилятор вы используете? для простого способа проверки вещей вручную см. ['CPU_TIME'] (https://gcc.gnu.org/onlinedocs/gfortran/CPU_005fTIME.html). Также [этот вопрос] (http://scicomp.stackexchange.com/questions/6812/fortran-best-way-to-time-sections-of-your-code) может оказаться полезным. – Gabe

+1

@Gabe Пожалуйста, не используйте 'CPU_TIME'. Он не подходит для измерения времени, особенно в [параллельном программировании] (https://stackoverflow.com/questions/25465101/fortran-parallel-programming). Вместо этого используйте 'SYSTEM_CLOCK'. –

+0

Ну графика в целом, но бенчмаркинг (надеюсь) не только с учетом системного времени. Например, [ruby benchmark] (http://ruby-doc.org/stdlib-1.9.3/libdoc/benchmark/rdoc/Benchmark.html) содержит интересные показатели, такие как пользовательское, системное и общее время, форматирует это в очень хороший дисплей и даже объясняет, какие меры предосторожности следует выполнять при бенчмаркинге. –

ответ

2

У меня есть GitHub проект, который измеряет производительность проходящих различных массивов на https://github.com/jlokimlin/array_passing_performance.git

Он использует CpuTimer полученного типа данных из https://github.com/jlokimlin/cpu_timer.git.

Использование:

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

Это интересно и может быть полезно, но вряд ли охватывает всю широкую тему вопроса. –

+0

Ну, это действительно то, что я хотел. Я попытаюсь ограничить свой вопрос, чтобы он соответствовал области ответа, которую я предполагаю. –

+0

В этом случае вы всегда можете начать с набора стандартных внутренних процедур 'system_clock()' и 'cpu_time()', хотя этот пакет имеет больше возможностей в одном объекте. –