«Быстрый» способ измерить время выполнения кода - PullRequest
0 голосов
/ 11 декабря 2018

В моем коде есть подпрограммы, время выполнения которых мне нужно измерить.Предположим, что в крайнем случае процедуры вызываются где-то 10-100 раз в секунду.Есть много способов измерить время в Фортране, но из-за частоты вызовов мне нужен тот, который требует наименьших затрат.

Само измерение времени не обязательно должно быть сверхточным, так как яМеня не интересуют случаи, когда подпрограммы занимают несколько миллисекунд или меньше, а скорее, когда они достигают 50 мс или более (то есть когда мне нужно предпринять контрмеры и заново сбалансировать некоторые вещи внутренне).

Код распараллеливается с использованием MPI + OpenMP, так что MPI_Wtime() будет самым простым способом, но я полагаю, что это связано с довольно большими затратами?Мое предположение для хорошего решения было бы system_clock().Кто-нибудь знает, безопасно ли (с точки зрения производительности) вызывать это 50-100 раз в секунду?

1 Ответ

0 голосов
/ 11 декабря 2018

system_clock, вероятно, значительно дешевле, чем cpu_time, и имеет гораздо лучшую точность.

Для GFortran в Linux, я смутно припоминаю, что когда-то тестировал, вызывая его в цикле, и system_clock брал порядка 50 нс на вызов.

Для GFortran в Linux system_clock - это оболочка для clock_gettime(CLOCK_MONOTONIC, ...) (которая в Linux использует vDSO, а не настоящий системный вызов, поэтому он очень и очень быстр), как и omp_get_wtime в libgomp (библиотека времени выполнения OpenMP, которую использует GFortran), поэтому производительность дляоба они должны быть примерно одинаковыми.

Я не уверен, как MPI_Wtime реализован в распространенных реализациях MPI, но меня не удивит, если он одинаковый.

...