Измерьте время выполнения в С++ OpenMP-коде
Я запускаю .cpp-код (i) в последовательном стиле и (ii) используя операторы OpenMP. Я пытаюсь увидеть разницу во времени. Для вычисления времени я использую это:
#include <time.h>
.....
main()
{
clock_t start, finish;
start = clock();
.
.
.
finish = clock();
processing time = (double(finish-start)/CLOCKS_PER_SEC);
}
Время довольно точное в последовательном (выше) запуске кода. Это займет около 8 секунд. Когда я вставляю операторы OpenMP в код и затем вычисляю время, я получаю сокращение времени, но отображаемое время составляет около 8-9 секунд на консоли, когда на самом деле это всего лишь 3-4 секунды в реальном времени!
Вот как мой код выглядит абстрактно:
#include <time.h>
.....
main()
{
clock_t start, finish;
start = clock();
.
.
#pragma omp parallel for
for( ... )
for( ... )
for (...)
{
...;
}
.
.
finish = clock();
processing time = (double(finish-start)/CLOCKS_PER_SEC);
}
Когда я запускаю приведенный выше код, я получаю сокращение во времени, но отображаемое время не является точным с точки зрения реального времени. Мне кажется, что функция clock() вычисляет каждое отдельное время каждого потока и складывает их и отображает их.
Может ли кто-нибудь объяснить причину этого или предложить мне какую-либо другую функцию синхронизации для измерения времени в программах OpenMP?
Спасибо.
Ответы
Ответ 1
Я видел clock() время процессора, а не в реальном времени.
Вы можете использовать
struct timeval start, end;
gettimeofday(&start, NULL);
// benchmark code
gettimeofday(&end, NULL);
delta = ((end.tv_sec - start.tv_sec) * 1000000u +
end.tv_usec - start.tv_usec) / 1.e6;
Вместо этого время
Ответ 2
Мне кажется, что функция clock() вычисляет каждое отдельное время каждого потока и складывает их и отображает их.
Это то, что делает clock()
- он измеряет время процессора, используемое процессом, которое по крайней мере на Linux и Mac OS X означает совокупное время процессора всех потоков, которые когда-либо существовали в процессе с момента его запуска.
Время работы часов в режиме реального времени (a.k.a.) для приложений OpenMP должно выполняться с использованием вызова таймера OpenMP с высоким разрешением omp_get_wtime()
, который возвращает значение double
количества секунд с произвольной точки в прошлом. Это переносная функция, например. существует как в Unix, так и в Windows OpenMP, в отличие от gettimeofday()
, который является Unix-only.
Ответ 3
Ну да, то, что должен делать clock()
, рассказать вам, сколько процессорного времени используется программой.
Если вы хотите найти истекшее реальное время, вместо времени процессора, используйте функцию, которая возвращает время настенных часов, например gettimeofday()
.
Ответ 4
#include "ctime"
std::time_t start, end;
long delta = 0;
start = std::time(NULL);
// do your code here
end = std::time(NULL);
delta = end - start;
// output delta