[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 RAM

    compiliert 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...


Log in to reply