Main Page   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Compound Members   File Members  

PsPvmBenchController.h

Go to the documentation of this file.
00001 /*
00002  * This file is part of openMask © INRIA, CNRS, Universite de Rennes 1 1993-2002, thereinafter the Software
00003  * 
00004  * The Software has been developped within the Siames Project. 
00005  * INRIA, the University of Rennes 1 and CNRS jointly hold intellectual property rights
00006  * 
00007  * The Software has been registered with the Agence pour la Protection des
00008  * Programmes (APP) under registration number IDDN.FR.001.510008.00.S.P.2001.000.41200
00009  *
00010  * This file may be distributed under the terms of the Q Public License
00011  * version 1.0 as defined by Trolltech AS of Norway and appearing in the file
00012  * LICENSE.QPL included in the packaging of this file.
00013  *
00014  * Licensees holding valid specific licenses issued by INRIA, CNRS or Université de Rennes 1 
00015  * for the software may use this file in accordance with that specific license 
00016  *
00017  */
00018 #ifndef PsPvmBenchControllerHEADER
00019 #define PsPvmBenchControllerHEADER
00020 
00021 #include <PsPvmController.h>
00022 #include <PsBenchController.h>
00023 #include <fstream>
00024 
00029 template <class APvmController>
00030 class PsPvmBenchController : public PsBenchController<APvmController> 
00031 {
00032 public :
00034    PsPvmBenchController (PsObjectDescriptor & scenario,
00035                          const PsDate & initialSimulationDate,
00036                          int argc,
00037                          char * argv []);
00038    virtual ~PsPvmBenchController () ;
00039    virtual void computeNextSimulationStep();
00040    virtual void compute();
00042    virtual PsnScheduler * createScheduler() ; 
00043    virtual void parseSynchronisationMessage (PsnPvmIncomingMessage * message) ;
00044 protected :
00045    long dureePartielleRecep;
00046    vector<long> _stepDurationTab ;
00047    vector<long> _completeDurationTab ;
00048    vector<long> _networkReceiveDurationTab ;
00049    vector<long> _demarshallingDurationTab ;
00050    vector<long> _networkSendDurationTab ;
00051    vector<long> _marshallingDurationTab ;
00052 } ; // PsPvmBenchController
00053 
00054 
00055 #include <PsDuplicatedObject.h>
00056 #include <sys/time.h>
00057 #include <unistd.h>
00058 #include <limits.h>
00059 #include <fstream>
00060 #include <iostream>
00061 #include <iomanip>
00062 
00063 #include "PsConfigurationParameterDescriptor.h"
00064 #include "PsnSvm.h"
00065 
00066 #include "PsSynchronisationMessage.h"
00067 #include "PsnMirrorObjectHandle.h"
00068 #include "PsnPvmReferenceObjectHandle.h"
00069 #include "PsnPvmDuplicatedObjectHandle.h"
00070 
00071 #include <assert.h>
00072 
00073 template <class APvmController>
00074 PsPvmBenchController<APvmController>::PsPvmBenchController (PsObjectDescriptor & scenario,
00075                                             const PsDate & initialSimulationDate,
00076                                             int argc,
00077                                             char * argv []) 
00078    : PsBenchController<APvmController>(scenario,initialSimulationDate,argc,argv)
00079 {
00080 }
00081 
00082 template <class APvmController>
00083 PsPvmBenchController<APvmController>::~PsPvmBenchController () 
00084 {
00085    ostream * out ;
00086    if ( _file != NULL )
00087       {
00088          out = _file ;
00089       }
00090    else
00091       {
00092          out = & cout ;
00093       }
00094    long moyenne, moyenneGlobale,moyenneAttente,moyenneDecodage,moyenneTransmission, moyenneCreation;
00095    int nbValeurs,nbValeursGlobale,nbValeursAttente,nbValeursDecodage,nbValeursTransmission,nbValeursCreation;
00096    long duree, dureeGlobale,dureeAttente,dureeDecodage,dureeTransmission,dureeCreation;
00097 #ifdef _SGI
00098    timespec resolutionHorloge;
00099    clock_getres(CLOCK_SGI_CYCLE,&resolutionHorloge);   
00100    *out<<"Resolution of the timer in seconds: "<<resolutionHorloge.tv_sec<<endl;
00101    *out<<"Resolution of the timer in nanoseconds : "<<resolutionHorloge.tv_nsec<<endl;
00102 #endif
00103    moyenne=0;
00104    moyenneGlobale=0;
00105    moyenneAttente=0;
00106    moyenneDecodage=0;
00107    moyenneTransmission=0;
00108    moyenneCreation=0;
00109    nbValeursGlobale=0;
00110    nbValeurs=0;
00111    nbValeursAttente=0;
00112    nbValeursDecodage=0;
00113    nbValeursTransmission=0;
00114    nbValeursCreation=0;
00115 #ifdef _PRINTCOMPLETESAMPLE
00116    *out<<"Duree globale, duree sans PVM, temps attente, temps décodage,temps de transmission, temps de creation des messages"<<endl;
00117 #endif
00118    for(int i=0;i<_numberOfSamples;i++) 
00119       {
00120          dureeGlobale = _completeDurationTab [i] ;
00121 #ifdef _PRINTCOMPLETESAMPLE
00122          *out<<dureeGlobale<<" , ";
00123 #endif
00124          if (dureeGlobale>=0) 
00125             {
00126                moyenneGlobale = moyenneGlobale + dureeGlobale ;
00127                nbValeursGlobale++;
00128             }
00129          duree=_stepDurationTab[i];
00130 #ifdef _PRINTCOMPLETESAMPLE
00131          *out<<duree<<" , "; 
00132 #endif
00133          if (duree>=0) 
00134             {
00135                moyenne = moyenne + duree;
00136                nbValeurs++;
00137             }
00138          dureeAttente=_networkReceiveDurationTab[i];
00139 #ifdef _PRINTCOMPLETESAMPLE
00140          *out<<dureeAttente<<" , "; 
00141 #endif
00142          if (dureeAttente>=0) 
00143             {
00144                moyenneAttente = moyenneAttente + dureeAttente ;
00145                assert ( moyenneAttente >= 0 ) ;
00146                nbValeursAttente++;
00147             }
00148          dureeDecodage=_demarshallingDurationTab[i];
00149 #ifdef _PRINTCOMPLETESAMPLE
00150          *out<<dureeDecodage<<" , ";
00151 #endif
00152          if (dureeDecodage>=0) 
00153             {
00154                moyenneDecodage = moyenneDecodage + dureeDecodage ;
00155                assert ( moyenneDecodage >= 0 ) ;
00156                nbValeursDecodage++;
00157             }
00158          dureeTransmission=_networkSendDurationTab[i];
00159 #ifdef _PRINTCOMPLETESAMPLE
00160          *out<<dureeTransmission<<" , "; 
00161 #endif
00162          if (dureeTransmission>=0) 
00163             {
00164                moyenneTransmission = moyenneTransmission + dureeTransmission ;
00165                nbValeursTransmission++;
00166             }
00167          dureeCreation=_marshallingDurationTab[i];
00168 #ifdef _PRINTCOMPLETESAMPLE
00169          *out<<dureeCreation<<endl; 
00170 #endif
00171          if (dureeCreation>=0) 
00172             {
00173                moyenneCreation = moyenneCreation + dureeCreation ;
00174                nbValeursCreation++;
00175             }
00176       }
00177    *out<<"Therefore, the average "<<endl
00178        <<" - time needed to compute a simulation step is: "<<moyenneGlobale/nbValeursGlobale<<endl
00179        <<" - time used by computations: "<<moyenne/nbValeurs<<endl
00180        <<" - time used synchronizing: "<<moyenneAttente/nbValeursAttente<<endl
00181        <<" - time used demarshalling: "<<moyenneDecodage/nbValeursDecodage<<endl
00182        <<" - time used transmitting: "<<moyenneTransmission/nbValeursTransmission<<endl
00183        <<" - time used marshalling: "<<moyenneCreation/nbValeursCreation<<endl; 
00184 
00185 }
00186 
00187 
00188 template <class APvmController>
00189 PsnScheduler * PsPvmBenchController<APvmController>::createScheduler()
00190 {
00191    PsnScheduler * res ;
00192 
00193    res = PsBenchController<APvmController>::createScheduler() ;
00194 
00195    _stepDurationTab.resize(_numberOfSamples) ;
00196 
00197    _completeDurationTab.resize(_numberOfSamples) ;
00198 
00199    _networkReceiveDurationTab.resize(_numberOfSamples) ;
00200 
00201    _networkSendDurationTab.resize(_numberOfSamples) ;
00202 
00203    _demarshallingDurationTab.resize(_numberOfSamples) ;
00204 
00205    _marshallingDurationTab.resize(_numberOfSamples) ;
00206 
00207    return res ;
00208 }
00209 
00210 
00211 template <class APvmController>
00212 void PsPvmBenchController<APvmController>::parseSynchronisationMessage (PsnPvmIncomingMessage * message) 
00213 {
00214    //Here, multiple calls have to be benched and accumulated
00215 #ifdef _SGI
00216    timespec before, after;
00217 
00218    clock_gettime(CLOCK_SGI_CYCLE, &before);
00219 
00220 
00221    PsBenchController<APvmController>::parseSynchronisationMessage(message);
00222 
00223    clock_gettime(CLOCK_SGI_CYCLE, &after);
00224 
00225    long duration = ( after.tv_nsec - before.tv_nsec ) / 1000 ;
00226 
00227    if (duration > 0) dureePartielleRecep += duration ;
00228 
00229    assert ( dureePartielleRecep >= 0 ) ;
00230 #else
00231    timeval before, after ;
00232 
00233    gettimeofday ( &before, NULL ) ;
00234    
00235    PsBenchController<APvmController>::parseSynchronisationMessage(message);
00236 
00237    gettimeofday ( &after, NULL ) ;
00238 
00239    long duration = after.tv_usec - before.tv_usec;
00240 
00241    if (duration > 0) dureePartielleRecep += duration ;
00242 #endif
00243 }
00244 
00245 
00246 
00247 template <class APvmController>
00248 void PsPvmBenchController<APvmController>::compute ()
00249 {
00250    //initialisation des compteurs du pas de calcul
00251    if ( ( _startSamplingDate <= _date ) &&
00252         ( _date <= _endSamplingDate )) 
00253       {
00254          assert ( _sampleIndex < _numberOfSamples ) ;
00255          assert ( _sampleIndex >= 0 ) ;
00256 #ifdef _SGI
00257          timespec before, after;
00258          clock_gettime(CLOCK_SGI_CYCLE, &before);
00259          PsBenchController<APvmController>::compute ();
00260          clock_gettime(CLOCK_SGI_CYCLE, &after);
00261          long duration = ( after.tv_nsec - before.tv_nsec ) / 1000 ;
00262          _completeDurationTab[_sampleIndex] = duration ;         
00263 #else
00264          timeval before, after;
00265          gettimeofday ( &before, NULL ) ;
00266          PsBenchController<APvmController>::compute ();
00267          gettimeofday ( &after, NULL ) ;
00268          long duration = after.tv_usec - before.tv_usec ;
00269          _completeDurationTab[_sampleIndex] = duration ;
00270 #endif
00271       }
00272    else 
00273       {
00274          PsBenchController<APvmController>::compute ();
00275       }
00276 }
00277 
00278 
00279 template <class APvmController>
00280 void PsPvmBenchController<APvmController>::computeNextSimulationStep() 
00281 {
00282 #ifdef _SGI
00283    timespec avantG;
00284    timespec avant, apres;
00285    //Le pas de simulation standard
00286    clock_gettime(CLOCK_SGI_CYCLE, &avantG);
00287 
00288    // get directly to the distributed controller, a we are redoing what the pvm controller is doing
00289    PsDistributedController::computeNextSimulationStep() ;
00290 
00291    //fin du pas de simulation standard
00292 
00293    clock_gettime(CLOCK_SGI_CYCLE, &avant);
00294 
00295    if(_sampleIndex>=0) _stepDurationTab[_sampleIndex] = ( avant.tv_nsec - avantG.tv_nsec ) / 1000 ;
00296    makeSynchronisationMessage (_referenceObjectsMap ) ;
00297    clock_gettime(CLOCK_SGI_CYCLE, &apres);
00298 
00299    if(_sampleIndex>=0) _marshallingDurationTab[_sampleIndex] = ( apres.tv_nsec-avant.tv_nsec ) / 1000;
00300    _distributedVirtualMachine->sendCurrentBuffersWithTag (PsnPvmMessage::SynchronisationMessage) ;  
00301 
00302    clock_gettime(CLOCK_SGI_CYCLE, &avant );
00303 
00304    if(_sampleIndex>=0) _networkSendDurationTab[_sampleIndex]= ( avant.tv_nsec-apres.tv_nsec ) / 1000 ;
00305 
00306    dureePartielleRecep=0;
00307    _distributedVirtualMachine->synchroniseReceiveAndProcessMessages (*this, PsnPvmMessage::SynchronisationMessage) ; 
00308 
00309    clock_gettime(CLOCK_SGI_CYCLE, &apres);
00310 
00311    if(_sampleIndex>=0) _demarshallingDurationTab[_sampleIndex] = dureePartielleRecep;
00312 
00313    if(_sampleIndex>=0) _networkReceiveDurationTab[_sampleIndex]= ( apres.tv_nsec-avant.tv_nsec ) / 1000 - dureePartielleRecep;
00314 #else
00315    timeval dateBefore, dateAfter ;
00316 
00317    //take the date before calling equivalent ancestor method
00318    gettimeofday(&dateAfter, NULL );
00319 
00320    // get directly to the distributed controller, a we are redoing what the pvm controller is doing
00321    PsDistributedController::computeNextSimulationStep () ;
00322 
00323    gettimeofday(&dateBefore, NULL );
00324 
00325    if(_sampleIndex>=0) _stepDurationTab[_sampleIndex] = dateBefore.tv_usec - dateAfter.tv_usec;
00326 
00327    makeSynchronisationMessage (_referenceObjectsMap ) ;
00328 
00329    gettimeofday(&dateAfter, NULL );
00330 
00331    if(_sampleIndex>=0) _marshallingDurationTab[_sampleIndex] = dateAfter.tv_usec - dateBefore.tv_usec;
00332 
00333    _distributedVirtualMachine->sendCurrentBuffersWithTag (PsnPvmMessage::SynchronisationMessage) ;  
00334 
00335    gettimeofday(&dateBefore, NULL );
00336 
00337    if(_sampleIndex>=0) _networkSendDurationTab[_sampleIndex] = dateBefore.tv_usec - dateAfter.tv_usec;
00338 
00339    dureePartielleRecep = 0;
00340 
00341    _distributedVirtualMachine->synchroniseReceiveAndProcessMessages (*this, PsnPvmMessage::SynchronisationMessage) ; 
00342 
00343    gettimeofday(&dateAfter, NULL );
00344 
00345    if(_sampleIndex>=0) _demarshallingDurationTab[_sampleIndex] = dureePartielleRecep;
00346 
00347    if(_sampleIndex>=0) _networkReceiveDurationTab[_sampleIndex] = dateAfter.tv_usec - dateBefore.tv_usec - dureePartielleRecep;
00348 #endif
00349 }
00350 
00351 #endif

logo OpenMask

Documentation generated on Mon Nov 25 15:25:02 2002

Generated with doxygen 1.2.12 by Dimitri van Heesch ,   1997-2001