Получить время выполнения параллельной программы Prolog - PullRequest
0 голосов
/ 12 мая 2018

Я использую SWI Prolog и у меня есть программа, которая выглядит так:

main :-
   statistics(runtime, [T0|_]),
   thread_create(...),
   thread_create(...),
   thread_join(...),
   thread_join(...),
   statistics(runtime, [T1|_]),
   T is T1 - T0,
   print(T).

Проблема в том, что по какой-то причине T всегда равно 0. Однако, если часть thread_create / thread_join заменяется эквивалентным серийным кодом, я получаю ненулевое время.

Обходной путь (но я думаю, что это не на 100% правильно), который я обнаружил, использует walltime вместо runtime в качестве первого параметра для statistics/2, но я прочитал, что время стены похоже на Фактическое время, которое я мог измерить, скажем, на настоящих настенных часах, и его не следует использовать для измерения времени выполнения программы.

РЕДАКТИРОВАТЬ: Кроме того, если я добавлю подобный механизм синхронизации в цели каждого потока, время также ненулевые. Я предполагаю, что runtime измеряет время ЦП только для потока, в котором он выполняется, и оценивается в 0 в первом потоке (в котором запущен main), потому что этот поток делает очень мало, кроме делегирования реальной работы вновь созданным потокам. .

1 Ответ

0 голосов
/ 13 мая 2018

Вы используете ключи совместимости , в основном исходящие от Quintus Prolog, когда не было потоков, и миллисекунды считались очень точными. Используйте родные ключи. Одним из них является process_cputime, возвращающее процессорное время всего процесса (все потоки). Также есть thread_cputime возвращает время процессора всех завершенных потоков и просто cputime возвращает время вызывающего потока. Все значения являются числами с плавающей точкой, выражающими время в секундах. Разрешение зависит от ОС, как правило, достаточно точно на современных ОС.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...