2015-07-09 11 views
6

Próbuję zmierzyć czas wykonania programu wielowątkowego. Mam używać tego kawałka kodu w głównym programie do obliczania czasu:czas wykonywania w środowisku wielowątkowym

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

Teraz problem mam jest: na przykład uruchomić mój program z 4 gwintu (każdy wątek działa na jednym rdzeniu), się czas realizacji to 21,39. Sprawdzam swój monitor systemu w czasie wykonywania, gdzie czas wykonania wynosi około 5,3.

Wygląda na to, że rzeczywisty czas wykonania jest mnożony przez liczbę GWINTÓW.

Na czym polega problem?

+0

Czy możesz spróbować stworzyć [Minimal, kompletne i weryfikowalne Przykład] (http://stackoverflow.com/help/mcve) i Pokaż nam? Ponieważ tylko za pomocą kodu, który nam pokazujesz, nie można nic powiedzieć na pewno. –

Odpowiedz

8

To dlatego, że monitorowanie CPU time który jest łączny czas spędzony przez procesor wykonujący swój kod, a nie Wall time który jest w świecie rzeczywistym czas, jaki upłynął między swoimi startTime i stopTime.

Rzeczywiście clock_t:

Zwraca czas procesora zużywanej przez program.

Jeśli do matematyki: 5.3 * 4 = 21.2 co jest, co oznacza, że ​​można uzyskać masz dobrego kodu wielowątkowe z SpeedUp z 4.

Aby zmierzyć czas ściany, powinieneś raczej użyć na przykład std::chrono::high_resolution_clock i powinieneś wrócić 5.3. Możesz także użyć klasycznego gettimeofday().

Jeśli używasz OpenMP dla wielowątkowości masz również omp_get_wtime()

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

dzięki za pomocną odpowiedź. :) – stella

Powiązane problemy