Newer
Older
#include "JikanDepths.h"
#include "ToJSON.h"
#include <iostream>
#include <map>
#include <string>
#ifdef INCLUDE_OPEN_MP
#include <omp.h>
#endif
#pragma omp master
{
this->EventType["Synchronous events"] = set<string>();
this->EventType["Asynchronous events"] = set<string>();
this->JSONname = OUTPUT_NAME + string(".json");
this->JSONdata = "";
this->Error = "";
}
};
#ifdef INCLUDE_MPI
bool Jikan::ifWriteProc(MPI_Comm comm, int id)
{
bool if_write = false;
int init_flag, fin_flag, iproc;
MPI_Initialized(&init_flag);
MPI_Finalized(&fin_flag);
bool if_MPI = (init_flag) && (!fin_flag);
if(if_MPI)
{
MPI_Comm_rank(comm, &iproc);
if( iproc == id)
if_write = true;
}
else
if_write = true;
return if_write;
}
#endif
bool Jikan::ifWriteProc()
{
return true;
}
#pragma omp master
{
this->Events.clear();
map<string, set<string> >::iterator it;
for(it = this->EventType.begin(); it!=this->EventType.end(); ++it)
it->second.clear();
}
bool Jikan::ifContains(const string& Name)
{
map<string, EventData>::iterator it;
it = this->Events.find(Name);
if (it == this->Events.end())
return false;
return true;
}
void Jikan::Jikan_start(const string& name, const int& mode)
#pragma omp master
{
(this->Events)[name].ifStart = true;
}
#pragma omp master
{
(this->Events)[name] = EventData(name);
(this->Events)[name].GetModeVals(mode);
}
#pragma omp barrier
ifMPI = (this->Events)[name].mode[0], ifOpenMP = (this->Events)[name].mode[1];
#pragma omp master
{
if(!ExistFlag)
{
string EventTypeName;
if(mode == TimerMode::NO_SYNC)
EventTypeName = "Asynchronous events";
else
EventTypeName = "Synchronous events";
this->EventType[EventTypeName].insert(name);
}
//--------------------------- MPI synchronization ---------------------------------------
if(ifMPI)
this->BarrierMPI();
//---------------------------------------------------------------------------------------
}
//--------------------------- OpenMP synchronization --------------------------------
if(ifOpenMP)
//-----------------------------------------------------------------------------------
}
}
void Jikan::Jikan_end(const string& name)
ExistFlag = this->ifContains(name);
ifStart = (this->Events)[name].ifStart;
if((!ExistFlag) || (!ifStart))
return;
ifMPI = (this->Events)[name].mode[0], ifOpenMP = (this->Events)[name].mode[1], ifCUDA = (this->Events)[name].mode[2];
#pragma omp master
{
if((ifCUDA) && (!ifMPI) && (!ifOpenMP))
{
#ifdef INCLUDE_GPU_TIMER
this->cuda_Jikan_end(name);
//--------------------------- OpenMP synchronization --------------------------------
if(ifOpenMP)
{
#pragma omp barrier
}
//-----------------------------------------------------------------------------------
//--------------------------- MPI synchronization ---------------------------------------
#pragma omp master
{
if(ifMPI)
this->BarrierMPI();
}
//---------------------------------------------------------------------------------------
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
}
void Jikan::GenerateTypedOutputData(const string& EventType, string& EventTypeString)
{
const int n = this->EventType[EventType].size();
EventTypeString = JSON::StartTypedBlock(EventType);
if(n == 0)
{
EventTypeString += "\n\t}";
return;
}
string Row;
string Name;
set<string>::iterator it;
set<string>::iterator end_m = this->EventType[EventType].end();
--end_m;
for (it = this->EventType[EventType].begin(); it != end_m; ++it)
{
Name = *it;
JSON::GenerateRow(this->Events[Name], Row, JSON::SeparateRows);
EventTypeString += Row;
}
Name = *end_m;
JSON::GenerateRow(this->Events[Name], Row, JSON::FinishRows);
EventTypeString += Row;
}
void Jikan::GenerateOutputData()
{
map<string, set<string> >::iterator it;
map<string, set<string> >::iterator end_m = this->EventType.end();
--end_m;
string Name;
string Out = "{ ";
string TypedOutput;
for(it = this->EventType.begin(); it!=end_m; ++it)
{
Name = it->first;
TypedOutput = "";
this->GenerateTypedOutputData(Name, TypedOutput);
Out += TypedOutput + ",\n";
}
Name = end_m->first;
TypedOutput = "";
this->GenerateTypedOutputData(Name, TypedOutput);
Out += TypedOutput + "\n}";
this->JSONdata = Out;
bool OutputRes = JSON::WriteOutput(this->JSONname, this->JSONdata);
if(OutputRes != true)
{
this->Error = JSON::Error;
}
void Jikan::SetDumpFilename(const string& name)
{
this->JSONname = name;
}
{
bool ifMPI = (this->Events)[name].mode[0], ifOpenMP = (this->Events)[name].mode[1], ifCUDA = (this->Events)[name].mode[2];
if((ifCUDA))
{
#ifdef INCLUDE_GPU_TIMER
this->cuda_Jikan_start(name);
#endif
}
#ifdef INCLUDE_OPEN_MP
else if( (!ifMPI) && (ifOpenMP) )
(this->Events)[name].double_start = omp_get_wtime();
else
(this->Events)[name].start = chrono::steady_clock::now();
bool ifMPI = (this->Events)[name].mode[0], ifOpenMP = (this->Events)[name].mode[1], ifCUDA = (this->Events)[name].mode[2];
if((ifCUDA))
{
#ifdef INCLUDE_GPU_TIMER
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
#endif
}
#ifdef INCLUDE_OPEN_MP
else if( (!ifMPI) && (ifOpenMP))
{
double end = omp_get_wtime();
double main_elapsed = end - (this->Events)[name].double_start;
(this->Events)[name].elapsed_time += main_elapsed;
(this->Events)[name].count ++;
#ifdef SAVE_TIME_SERIES
(this->Events)[name].time_series.push_back(main_elapsed);
#endif
}
#endif
else
{
chrono_time_type end = chrono::steady_clock::now();
chrono_time_type start = (this->Events)[name].start;
double main_elapsed = chrono::duration_cast<chrono::nanoseconds>(end - start).count() * 1e-9;
(this->Events)[name].elapsed_time += main_elapsed;
(this->Events)[name].count ++;
#ifdef SAVE_TIME_SERIES
(this->Events)[name].time_series.push_back(main_elapsed);
#endif
}
}
void Jikan::BarrierMPI()
{
#ifdef INCLUDE_MPI
int init_flag, fin_flag;
MPI_Initialized(&init_flag);
MPI_Finalized(&fin_flag);
if((!fin_flag) && init_flag)
MPI_Barrier(MPI_COMM_WORLD);
#endif
}
class Jikan Timer;