[clock()] maschinenabhängig?
-
Wir verwenden MPI für die parallele Berechnung von Strömungen.
Hierbei habe ich folgende abstrahierte Vorgehensweise:Master: { double startTimeMPI = MPI::Wtime(); clock_t startTimeStd = clock(); //clock_t ist normalerweise vom Typ ein long ... //starte clienten (die ebenfalls die Zeit von Start bis Ende messen) MPI::Barrier(); //sync Punkt double endTimeMPI = MPI::Wtime(); clock_t endTimeStd = clock(); cout<<"Master-MPI: "<< endTimeMPI-startTimeMPI <<"s"<<endl; cout<<"Master-Std: "<< (double)(endTimeStd-startTimeStd)/CLOCKS_PER_SEC<<"s"<<endl; } ////////////////////////////////////////////////////// Client: { double startTimeMPI = MPI::Wtime(); clock_t startTimeStd = clock(); ... //berechne MPI::Barrier(); //sync Punkt double endTimeMPI = MPI::Wtime(); clock_t endTimeStd = clock(); cout<<"Client-MPI: "<< endTimeMPI-startTimeMPI <<"s"<<endl; cout<<"Client-Std: "<< (double)(endTimeStd-startTimeStd)/CLOCKS_PER_SEC; <<"s"<<endl; }
Gerechnet wird auf folgendem Systemen:
A - Linux, AMD Opteron 2GHz, 16GB RAM
B - Linux, AMD Opteron 1.4GHz, 2GB RAMcompiliert wurde der Code auf System A mit gcc 3.4.
Bildschirmausgabe sah ungefähr so aus:
Client-MPI: 10s Client-Std: 10s Client-MPI: 12s Client-Std: 12s Master-MPI: 12s Master-Std: 8s
Die Daten sind nur Bsp Daten. Nun habe ich die Vermutung, dass es darin liegt, dass der Code auf einem inhomogenen System läuft, und die clock()-Methode irgendwie abhängig vom Maschinen-Typ ist zumindest in der gcc Implemenierung.
Weiß da jemand was genaueres?
Gibt es andereMöglichkeiten Std-mäßig die Zeit zu messen.
time_t ist zu ungenau... Je genauer desto besser. 1/1000s Auflösung wär schon prima.
Gerne auch boost (da schau ich gleich mal hin)
-
Afaik misst clock() nur die Zeit, die dein Programm zur Verfügung hatte (d.h. wenn das Betriebssystem deinen Prozess unterbricht, wird auch der Zähler angehalten). Etwas genaueres gibt es im Standard nicht, aber bestimmt auf Systemebene (unter Windows würde mir QueryPerformanceCounter einfallen).
PS: Und die Tatsache, daß die Clock-Ticks systemabhängig sind, könnte auch mit eine Rolle spielen Du verwendest den CLOCKS_PER_SEC Wert von System A, um Zeiten auf System B zu messen.
PPS: Du hast doch schon MPI::WTime() entdeckt - ich kenne die Funktion zwar nicht, aber was spricht dagegen, sie zu verwenden?
-
CLOCKS_PER_SEC ist eine #define und auf 1000 gesetzt.
gegen MPI::Wtime() spricht die Tatsache, dass unser Zeitmesser allgemein funktionieren soll. Das Progeramm läuft auch komplettt ohne MPI...
systemabhängig wäre auch i.O. Kennt da jemand gute Alternativen?
-
Uner Linux/BSD: gettimeofday
-
muffmolch schrieb:
CLOCKS_PER_SEC ist eine #define und auf 1000 gesetzt.
Auf System A, aber vermutlich nicht auf System B
-
CStoll schrieb:
Auf System A, aber vermutlich nicht auf System B
vermutlich, hehe. Die 1000 bezog sich auch auf meinen Windows Rechner und dort zeigt mir Visual Assist das define brav an. Vermutlich steckt der Teufel in der Implentierung der clock() methode, aber ich habe davon echt keinen Plan. jedenfalls kann man sich ja so nicht uaf die Zeitmessung verlassen. Aber selbst der boost timer arbeit nach demselben prinzip...