Подтвердить что ты не робот

Измерьте время выполнения в С++ 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?

Спасибо.

4b9b3361

Ответ 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