diff --git a/Event.cpp b/Event.cpp index f722cb249dd0185a3b8394da413cd3e5792e0cc1..bd43d529a4a7aba24fbd538041e2483eb2900565 100644 --- a/Event.cpp +++ b/Event.cpp @@ -15,6 +15,7 @@ EventData::EventData() this->start = chrono::steady_clock::now(); this->elapsed_time = 0.0; this->count = 0; + this->ContiniousTime = 0.0; // this->ifCUDA = 0; this->event_name = "Unnamed"; this->ifStart = false, this->ifEnd = false; @@ -53,7 +54,7 @@ EventData::EventData(const string& name) this->start = chrono::steady_clock::now(); this->elapsed_time = 0.0; this->count = 0; - // this->ifCUDA = 0; + this->ContiniousTime = 0.0; this->event_name = name; this->ifStart = false, this->ifEnd = false; this->if_mode_set = false; @@ -74,7 +75,7 @@ EventData& EventData::operator=(const EventData& src) this->start = src.start; this->elapsed_time = src.elapsed_time; this->count = src.count; - // this->ifCUDA = 0; + this->ContiniousTime = src.ContiniousTime; this->event_name = src.event_name; this->ifStart = src.ifStart, this->ifEnd = src.ifEnd; this->if_mode_set = src.if_mode_set; diff --git a/Event.h b/Event.h index cff3885b1c9ab09330283eb73dbe8ea9d4dd25d4..8a4f7dcae8b808a67cec2c38451fa7e05b6c6c31 100644 --- a/Event.h +++ b/Event.h @@ -23,6 +23,7 @@ public: bool ifCUDAinit; // If CUDA variables are initialized bool ifStart, ifEnd; // If measurment for current code block is started/finished double elapsed_time, double_start; // seconds + double ContiniousTime; int count; // Count of current code block measurments chrono_time_type start; std::vector<double> time_series; // Measurments time series for current code block diff --git a/Jikan.cpp b/Jikan.cpp index 652666b063ae3ecd281a2517f0dc9a833cddbe13..6b71019fa3d9a16b36c72bb5f927c4cce69d0ee8 100644 --- a/Jikan.cpp +++ b/Jikan.cpp @@ -16,11 +16,11 @@ extern "C" Timer.JikanStart(str_name, mode); } - void TimerEnd(const char* name) + void TimerEnd(const char* name, const int cont_mode_t) { string str_name = name; - Timer.JikanEnd(str_name); + Timer.JikanEnd(str_name, cont_mode_t); } void WriteOutput() diff --git a/Jikan.h b/Jikan.h index 8c9c792a790139d00ff241299c86c89719441ad5..1acf6d12c219d4e13bfbb283df13dda411ccabb1 100644 --- a/Jikan.h +++ b/Jikan.h @@ -27,17 +27,23 @@ enum TimerMode MPI_CUDA = MPI_mode * CUDA_mode, }; +enum ContinueMode +{ + cont = 1, + finish = 0, +}; + #ifdef __cplusplus extern "C" { #endif void TimerStart(const char* name, const int mode_t); - void TimerEnd(const char* name); + void TimerEnd(const char* name, const int cont_mode_t); void WriteOutput(); #ifdef TIMER_ON #define START_JIKAN_TIMER(name, mode_t) TimerStart(name, mode_t); - #define END_JIKAN_TIMER(name) TimerEnd(name); + #define END_JIKAN_TIMER(name, cont_mode_t) TimerEnd(name, cont_mode_t); #define JIKAN_TIMER_OUTPUT() WriteOutput(); #else #define START_JIKAN_TIMER(name, mode_t) diff --git a/JikanDepths.cpp b/JikanDepths.cpp index 7198133a3efddaab60bb00c7ceb3c140233cdb78..c4e5fb1197e33a55136c30e920e5c22133c83014 100644 --- a/JikanDepths.cpp +++ b/JikanDepths.cpp @@ -55,6 +55,26 @@ Jikan::Jikan() bool Jikan::ifWriteProc() { + #ifdef INCLUDE_MPI + int init_flag, fin_flag; + + MPI_Initialized(&init_flag); + MPI_Finalized(&fin_flag); + + int GlobalCommRank; + + if((!fin_flag) && init_flag) + { + MPI_Comm_rank(MPI_COMM_WORLD, &GlobalCommRank); + if(GlobalCommRank == 0) + return true; + else + return false; + } + else + return true; + #endif + return true; } @@ -178,7 +198,7 @@ void Jikan::JikanStart(const string& name, const int& mode) // printf("177 (this->Events)[name].ifStart = %d\n", (this->Events)[name].ifStart); } -void Jikan::JikanEnd(const string& name) +void Jikan::JikanEnd(const string& name, const int cont_mode_t) { bool ExistFlag, ifStart; bool ifMPI, ifOpenMP, ifCUDA; @@ -204,7 +224,7 @@ void Jikan::JikanEnd(const string& name) { #ifdef INCLUDE_GPU_TIMER this->EndCUDASync(name); - this->CUDAGetTime(name); + this->CUDAGetTime(name, cont_mode_t); #endif } #ifdef INCLUDE_OPEN_MP @@ -228,7 +248,7 @@ void Jikan::JikanEnd(const string& name) if(ifMPI) this->BarrierMPI(); - this->EndEvent(name); + this->EndEvent(name, cont_mode_t); #ifdef INCLUDE_OPEN_MP } #endif @@ -324,14 +344,17 @@ void Jikan::StartEvent(const string& name) (this->Events)[name].start = chrono::steady_clock::now(); } -void Jikan::EndEvent(const string& name) +#define btoa(x) ((x)?"true":"false") + +void Jikan::EndEvent(const string& name, const int cont_mode_t) { bool ifMPI = (this->Events)[name].mode[0], ifOpenMP = (this->Events)[name].mode[1], ifCUDA = (this->Events)[name].mode[2]; - if((ifCUDA)) + // printf("%s %s %s\n", btoa(ifMPI), btoa(ifOpenMP), btoa(ifCUDA)); + + if(ifCUDA) { #ifdef INCLUDE_GPU_TIMER - // printf("EndCUDASync\n"); this->EndCUDASync(name); #endif } @@ -343,10 +366,19 @@ void Jikan::EndEvent(const string& name) double main_elapsed = end - (this->Events)[name].double_start; (this->Events)[name].elapsed_time += main_elapsed; - (this->Events)[name].count ++; + (this->Events)[name].ContiniousTime += main_elapsed; + + if(cont_mode_t == 0) + { + (this->Events)[name].count ++; + } #ifdef SAVE_TIME_SERIES - (this->Events)[name].time_series.push_back(main_elapsed); + if(cont_mode_t == 0) + { + (this->Events)[name].time_series.push_back((this->Events)[name].ContiniousTime); + (this->Events)[name].ContiniousTime = 0.0; + } #endif } #endif @@ -357,12 +389,21 @@ void Jikan::EndEvent(const string& name) chrono_time_type start = (this->Events)[name].start; double main_elapsed = chrono::duration_cast<chrono::nanoseconds>(end - start).count() * 1e-9; - + //printf("%e\n", main_elapsed); (this->Events)[name].elapsed_time += main_elapsed; - (this->Events)[name].count ++; + (this->Events)[name].ContiniousTime += main_elapsed; + + if(cont_mode_t == 0) + { + (this->Events)[name].count ++; + } #ifdef SAVE_TIME_SERIES - (this->Events)[name].time_series.push_back(main_elapsed); + if(cont_mode_t == 0) + { + (this->Events)[name].time_series.push_back((this->Events)[name].ContiniousTime); + (this->Events)[name].ContiniousTime = 0.0; + } #endif } } @@ -380,4 +421,4 @@ void Jikan::BarrierMPI() #endif } -class Jikan Timer; \ No newline at end of file +class Jikan Timer; diff --git a/JikanDepths.cu b/JikanDepths.cu index 75335df92343c25682aeceaaf3b4992df6290b49..d1d734d59f50b81475467da5a8ef9ef10d38ff99 100644 --- a/JikanDepths.cu +++ b/JikanDepths.cu @@ -20,15 +20,24 @@ void Jikan::EndCUDASync(const string& name) cudaEventSynchronize((this->Events)[name].gpu_end); } -void Jikan::CUDAGetTime(const string& name) +void Jikan::CUDAGetTime(const string& name, const int cont_mode_t) { float GPUtime = 0.0; cudaEventElapsedTime(&GPUtime, (this->Events)[name].gpu_start, (this->Events)[name].gpu_end ); GPUtime *= 1e-3; (this->Events)[name].elapsed_time += GPUtime; - (this->Events)[name].count ++; + (this->Events)[name].ContiniousTime += GPUtime; + + if(cont_mode_t == 0) + { + (this->Events)[name].count ++; + } #ifdef SAVE_TIME_SERIES - (this->Events)[name].time_series.push_back(GPUtime); + if(cont_mode_t == 0) + { + (this->Events)[name].time_series.push_back((this->Events)[name].ContiniousTime); + (this->Events)[name].ContiniousTime = 0.0; + } #endif } \ No newline at end of file diff --git a/JikanDepths.h b/JikanDepths.h index 3a1eb939fd17624a5fe860e0e50a8b9302b3e369..d12e2597c974c24d04d11282ca2fb858390e5088 100644 --- a/JikanDepths.h +++ b/JikanDepths.h @@ -24,7 +24,7 @@ public: ~Jikan(); void JikanStart(const std::string& name, const int& mode); // Start code block measurments - void JikanEnd( const std::string& name); // End code block measurments + void JikanEnd( const std::string& name, const int cont_mode_t); // End code block measurments #ifdef INCLUDE_GPU_TIMER void StartCUDASync(const std::string& name); // Start CUDA synchronization @@ -47,9 +47,9 @@ public: private: void BarrierMPI(); // Start MPI barrier void StartEvent(const std::string& name); - void EndEvent(const std::string& name); + void EndEvent(const std::string& name, const int cont_mode_t); #ifdef INCLUDE_GPU_TIMER - void CUDAGetTime(const std::string& name); + void CUDAGetTime(const std::string& name, const int cont_mode_t); #endif }; \ No newline at end of file