C ++: синхронизация в Linux (с использованием clock ()) не синхронизирована (из-за OpenMP?)

В начале и в конце моей программы я использую clock (), чтобы выяснить, сколько времени уходит на выполнение моей программы. К сожалению, это, кажется, занимает вдвое меньше времени, чем это сообщает. Я дважды проверил это командой «time».

Моя программа сообщает:
Завершено в 45,86 с

Отчеты команды времени:
реальный 0m22.837s
пользователь 0m45.735s
sys 0m0.152s

С помощью моего мобильного телефона, чтобы рассчитать время, он завершился за 23 секунды (иначе: «реальное» время). «Пользовательское» время — это сумма всех потоков, что имеет смысл, так как я использую OpenMP. (Вы можете прочитать об этом здесь: Что означают «реальный», «пользователь» и «sys» в выводе времени (1)?)

Итак, почему clock () сообщает о «пользовательском» времени, а не «реальном» времени? Есть ли другая функция, которую я должен использовать, чтобы вычислить, как долго работает моя программа?

В качестве примечания, часы Windows () работают как положено и выдают отчеты в «реальном» времени.

1

Решение

пользователь 0m45.735s

clock() измеряет процессорное время используемый процесс (настолько хорошо, насколько это возможно) согласно 7.27.2.1

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

а не настенные часы. таким образом clock() сообщая время, близкое к user время, которое time Отчеты нормальные и соответствуют стандартам.

Чтобы измерить прошедшее время, если вы можете предположить POSIX, используя clock_gettime это наверное лучший вариант, стандартная функция time() может также использоваться для этого, но не очень мелкозернистый.

6

Другие решения

Я бы предложил clock_gettime с помощью CLOCK_MONOTONIC за часы.

В зависимости от вашей конкретной системы, это должно давать разрешение около микросекунды или лучше, и это не будет делать забавные вещи, если (например) кто-то установит системное время во время работы вашей программы.

2

Я хотел бы предложить, чтобы для тестирования производительности внутри приложений OpenMP вы использовали портативную функцию синхронизации OpenMP omp_get_wtime(), который возвращает double значение с секундами с некоторой неопределенной точки в прошлом. Вызовите его дважды и вычтите возвращаемые значения, чтобы получить истекшее время. Вы можете узнать, насколько точны измерения времени, позвонив omp_get_wtick(), Возвращает double значение разрешения таймера — значения ближе к 0.0 указать более точные таймеры.

0