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
| Documentation generated on Mon Nov 25 15:25:02 2002 |
Generated with doxygen 1.2.12 by Dimitri van Heesch , 1997-2001 |