2015-07-09 3 views
6

Я пытаюсь измерить время выполнения многопоточной программы. Я использовать этот кусок кода в основной программе для расчета времени:время выполнения в многопоточной среде

clock_t startTime = clock(); 
//do stuff 
clock_t stopTime = clock(); 
float secsElapsed = (float)(stopTime - startTime)/CLOCKS_PER_SEC; 

Теперь проблема у меня есть: , например, я запускаю свою программу с 4 нити (каждый поток работает на одном ядре), в время выполнения - 21.39. Я проверяю свой системный монитор во время выполнения, когда время выполнения составляет около 5,3.

Похоже, что фактическое время выполнения умножается на количество НИТЕЙ.

В чем проблема?

+0

Можете ли вы попробовать создать [Minimal, Complete, и Проверяемость Пример] (http://stackoverflow.com/help/mcve) и показать нам? Потому что только с кодом, который вы нам показываете, невозможно сказать что-то наверняка. –

ответ

8

Это потому, что вы мониторинг CPU time который является суммарное время, затраченное процессором выполнения кода, а не Wall time, который является временем в реальном мире прошло между вашим startTime и stopTime.

Действительно clock_t:

Возвращает время процессора, используемых программой.

Если вы делаете математику: 5.3 * 4 = 21.2 что и вы получите это означает, что у вас есть хороший многопоточного кода с ускорением 4.

Чтобы измерить время стены, вы должны использовать, например, std::chrono::high_resolution_clock, и вы должны вернуться 5.3. Вы также можете использовать классический gettimeofday().

Если вы используете OpenMP для многопоточности вы также omp_get_wtime()

double startTime = omp_get_wtime(); 
// do stuff 
double stopTime = omp_get_wtime(); 
double secsElapsed = stopTime - startTime; // that's all ! 
+0

благодарит за полезный ответ. :) – stella