Skip to content

Commit 84a82e4

Browse files
author
Marcus Walther
committed
- optimized measureTime
git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@22290 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
1 parent 821b3a5 commit 84a82e4

File tree

5 files changed

+125
-55
lines changed

5 files changed

+125
-55
lines changed

Compiler/Template/CodegenCpp.tpl

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1289,7 +1289,13 @@ case SIMCODE(modelInfo=MODELINFO(__), makefileParams=MAKEFILE_PARAMS(__)) then
12891289
std::pair<boost::shared_ptr<IMixedSystem>,boost::shared_ptr<ISimData> > system = simulation.first->LoadSystem("OMCpp<%fileNamePrefix%><%makefileParams.dllext%>","<%lastIdentOfPath(modelInfo.name)%>");
12901290
12911291
simulation.first->Start(system.first,simulation.second,"<%lastIdentOfPath(modelInfo.name)%>");
1292-
<% if boolNot(stringEq(getConfigString(PROFILING_LEVEL),"none")) then '//MeasureTimeRDTSC::deinitialize();' %>
1292+
1293+
<%if boolNot(stringEq(getConfigString(PROFILING_LEVEL),"none")) then
1294+
<<
1295+
MeasureTime::getInstance()->writeToJson();
1296+
//MeasureTimeRDTSC::deinitialize();
1297+
>>
1298+
%>
12931299
return 0;
12941300
12951301
}
@@ -1654,6 +1660,7 @@ case SIMCODE(modelInfo = MODELINFO(__)) then
16541660
let numOfEqs = SimCodeUtil.getMaxSimEqSystemIndex(simCode)
16551661
<<
16561662
measureTimeArray = std::vector<MeasureTimeData>(<%numOfEqs%>);
1663+
MeasureTime::addJsonContentBlock("<%dotPath(modelInfo.name)%>","profileBlocks",&measureTimeArray);
16571664
measuredStartValues = MeasureTime::getZeroValues();
16581665
measuredEndValues = MeasureTime::getZeroValues();
16591666
@@ -1680,12 +1687,6 @@ case SIMCODE(modelInfo = MODELINFO(__)) then
16801687
{
16811688
if(_functions != NULL)
16821689
delete _functions;
1683-
1684-
<%if boolNot(stringEq(getConfigString(PROFILING_LEVEL),"none")) then
1685-
<<
1686-
MeasureTime::getInstance()->writeTimeToJason("<%dotPath(modelInfo.name)%>",measureTimeArray);
1687-
>>
1688-
%>
16891690
}
16901691
16911692
@@ -7314,17 +7315,17 @@ end equation_function_call;
73147315
template measureTimeStart(String eq_number)
73157316
::=
73167317
<<
7317-
MeasureTime::getTimeValues(measuredStartValues);
7318-
for(int i = 0; i < 10; i++) {
7318+
MeasureTime::getTimeValuesStart(measuredStartValues);
7319+
//for(int i = 0; i < 10; i++) {
73197320
>>
73207321
end measureTimeStart;
73217322
73227323
template measureTimeStop(String eq_number)
73237324
::=
73247325
let eqNumber = intSub(stringInt(eq_number),1)
73257326
<<
7326-
}
7327-
MeasureTime::getTimeValues(measuredEndValues);
7327+
//}
7328+
MeasureTime::getTimeValuesEnd(measuredEndValues);
73287329
measuredEndValues->sub(measuredStartValues);
73297330
measuredEndValues->div(10);
73307331
//measuredEndValues->sub(MeasureTime::getOverhead());

SimulationRuntime/cpp/Core/Utils/extension/measure_time.cpp

Lines changed: 66 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,30 @@
11
#include <Core/Utils/extension/measure_time.hpp>
22

33
MeasureTime * MeasureTime::instance = 0;
4+
MeasureTime::file_map MeasureTime::toWrite;
5+
6+
MeasureTime::getTimeValuesFctType MeasureTime::getTimeValuesStartFct = 0;
7+
MeasureTime::getTimeValuesFctType MeasureTime::getTimeValuesEndFct = 0;
48

59
MeasureTimeValues::MeasureTimeValues() {}
610

711
MeasureTimeValues::~MeasureTimeValues() {}
812

9-
MeasureTimeData::MeasureTimeData() : id(0), sumMeasuredValues(MeasureTime::getZeroValues()), numCalcs(0), category("") {}
13+
MeasureTimeData::MeasureTimeData() : id(0), sumMeasuredValues(MeasureTime::getZeroValues()), numCalcs(0) {}
1014

1115
MeasureTimeData::~MeasureTimeData()
1216
{
1317
//if(sumMeasuredValues != NULL)
1418
//delete sumMeasuredValues;
1519
}
1620

21+
std::string MeasureTimeData::serializeToJson() const
22+
{
23+
std::stringstream ss("");
24+
ss << "\"ncall\":" << numCalcs << "," << sumMeasuredValues->serializeToJson();
25+
return ss.str();
26+
}
27+
1728
MeasureTime::MeasureTime() : overhead(NULL) {}
1829

1930
MeasureTime::~MeasureTime()
@@ -29,8 +40,13 @@ MeasureTime* MeasureTime::getInstance()
2940

3041
void MeasureTime::deinitialize()
3142
{
43+
std::cerr << "Deinit:" << std::endl;
3244
if (instance != 0)
45+
{
46+
std::cerr << "try is " << std::endl;
3347
delete instance;
48+
std::cerr << "succed!" << std::endl;
49+
}
3450
}
3551

3652
MeasureTimeValues* MeasureTime::getZeroValues()
@@ -61,14 +77,14 @@ void MeasureTime::benchOverhead()
6177

6278
for(int i = 0; i < 10; i++) //warmup
6379
{
64-
MeasureTime::getTimeValues(overheadMeasureStart);
65-
MeasureTime::getTimeValues(overheadMeasureEnd);
80+
MeasureTime::getTimeValuesStart(overheadMeasureStart);
81+
MeasureTime::getTimeValuesEnd(overheadMeasureEnd);
6682
}
6783

6884
for(int i = 0; i < 100; i++)
6985
{
70-
MeasureTime::getTimeValues(overheadMeasureStart);
71-
MeasureTime::getTimeValues(overheadMeasureEnd);
86+
MeasureTime::getTimeValuesStart(overheadMeasureStart);
87+
MeasureTime::getTimeValuesEnd(overheadMeasureEnd);
7288
overheadMeasureEnd->sub(overheadMeasureStart);
7389
overhead->add(overheadMeasureEnd);
7490
}
@@ -78,26 +94,52 @@ void MeasureTime::benchOverhead()
7894
delete overheadMeasureEnd;
7995
}
8096

81-
void MeasureTime::writeTimeToJason(std::string model_name, std::vector<MeasureTimeData> data)
97+
void MeasureTime::addJsonContentBlock(const std::string model_name, const std::string blockname, const std::vector<MeasureTimeData> * in)
98+
{
99+
toWrite[model_name][blockname] = in;
100+
}
101+
102+
void MeasureTime::writeToJson()
82103
{
83104
std::stringstream date;
84-
date.str("");
85-
time_t sec = time(NULL);
86-
tm * date_t = localtime(&sec);
87-
date << date_t->tm_year + 1900 << "-" << date_t->tm_mon + 1 << "-" << date_t->tm_mday << " " << date_t->tm_hour << ":" << date_t->tm_min << ":" << date_t->tm_sec;
88-
std::ofstream os;
89-
os.open((model_name + std::string("_prof.json")).c_str());
90-
os << "{\n\"name\":\"" << model_name << "\",\n";
91-
os << "\"prefix\":\"" << model_name << "\",\n";
92-
os << "\"date\":\"" << date.str() << "\",\n";
93-
94-
os << "\"functions\":[\n],\n";
95-
os << "\"profileBlocks\":[\n";
96-
97-
for (unsigned i = 0; i < data.size(); ++i)
105+
date.str("");
106+
time_t sec = time(NULL);
107+
tm * date_t = localtime(&sec);
108+
date << date_t->tm_year + 1900 << "-" << date_t->tm_mon + 1 << "-" << date_t->tm_mday << " " << date_t->tm_hour << ":" << date_t->tm_min << ":" << date_t->tm_sec;
109+
110+
for( file_map::const_iterator model = toWrite.begin() ; model != toWrite.end() ; ++model ) // iterate files
98111
{
99-
os << "{\"id\":" << (i+1) << ",\"ncall\":" << data[i].numCalcs << "," << data[i].sumMeasuredValues->serializeToJson() << "}" << ((i+1) == data.size() ? "" : ",") << "\n";
100-
}
101-
os << "]\n}";
102-
os.close();
112+
std::ofstream os;
113+
os.open((model->first + std::string("_prof.json")).c_str());
114+
os << "{\n\"name\":\"" << model->first << "\",\n";
115+
os << "\"prefix\":\"" << model->first << "\",\n";
116+
os << "\"date\":\"" << date.str() << "\",\n";
117+
118+
//write blocks:
119+
bool isFirstBlock = true;
120+
for( block_map::const_iterator block = model->second.begin() ; block != model->second.end() ; ++block ) // iterate blocks
121+
{
122+
const std::vector<MeasureTimeData> * data = block->second;
123+
124+
if(isFirstBlock) isFirstBlock = false;
125+
else
126+
{
127+
os << ",\n";
128+
}
129+
os << "\"" << block->first << "\":[\n";
130+
131+
//write data
132+
for (unsigned i = 0; i < data->size()-1; ++i)
133+
{
134+
os << "{\"id\":" << i+1 << "," << (*data)[i].serializeToJson() << "},\n";
135+
}
136+
if( data->size() > 0 ) os << "{\"id\":" << data->size() << "," << (*data)[data->size()-1].serializeToJson() << "}]";
137+
else os << "]";
138+
139+
} // end blocks
140+
141+
os << "\n}";
142+
os.close();
143+
144+
} // end files
103145
}

SimulationRuntime/cpp/Core/Utils/extension/measure_time_rdtsc.cpp

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,13 @@
11
#include <Core/Utils/extension/measure_time_rdtsc.hpp>
22

3-
MeasureTime::getTimeValuesFctType MeasureTime::getTimeValuesFct = 0;
4-
5-
MeasureTimeValuesRDTSC::MeasureTimeValuesRDTSC(unsigned long long time) : MeasureTimeValues(), time(time) {}
3+
MeasureTimeValuesRDTSC::MeasureTimeValuesRDTSC(unsigned long long time) : MeasureTimeValues(), time(time), max_time(time) {}
64

75
MeasureTimeValuesRDTSC::~MeasureTimeValuesRDTSC() {}
86

9-
std::string MeasureTimeValuesRDTSC::serializeToJson()
7+
std::string MeasureTimeValuesRDTSC::serializeToJson() const
108
{
119
std::stringstream ss;
12-
ss << "\"time\":" << time;
10+
ss << "\"time\":" << time << ",\"maxTime\":" << max_time;
1311
return ss.str();
1412
}
1513

@@ -21,7 +19,14 @@ MeasureTimeRDTSC::~MeasureTimeRDTSC()
2119
{
2220
}
2321

24-
void MeasureTimeRDTSC::getTimeValues(MeasureTimeValues *res)
22+
void MeasureTimeRDTSC::getTimeValuesStart(MeasureTimeValues *res)
23+
{
24+
MeasureTimeValuesRDTSC *val = static_cast<MeasureTimeValuesRDTSC*>(res);
25+
unsigned long long time = RDTSC();
26+
val->time = time;
27+
}
28+
29+
void MeasureTimeRDTSC::getTimeValuesEnd(MeasureTimeValues *res)
2530
{
2631
unsigned long long time = RDTSC();
2732
MeasureTimeValuesRDTSC *val = static_cast<MeasureTimeValuesRDTSC*>(res);
@@ -37,6 +42,9 @@ void MeasureTimeValuesRDTSC::add(MeasureTimeValues *values)
3742
{
3843
MeasureTimeValuesRDTSC *val = static_cast<MeasureTimeValuesRDTSC*>(values);
3944
time += val->time;
45+
46+
if( val->time > max_time )
47+
max_time = val->time;
4048
}
4149

4250
void MeasureTimeValuesRDTSC::sub(MeasureTimeValues *values)

SimulationRuntime/cpp/Include/Core/Utils/extension/measure_time.hpp

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,17 +9,18 @@
99
#include <string>
1010
#include <sstream>
1111
#include <vector>
12+
#include <map>
1213
#include <ctime>
1314
#include <iostream>
1415
#include <Core/Modelica.h>
1516

1617
class MeasureTimeValues
1718
{
18-
public:
19+
public:
1920
MeasureTimeValues();
2021
virtual ~MeasureTimeValues();
2122

22-
virtual std::string serializeToJson() = 0;
23+
virtual std::string serializeToJson() const = 0;
2324

2425
virtual void add(MeasureTimeValues *values) = 0;
2526
virtual void sub(MeasureTimeValues *values) = 0;
@@ -33,12 +34,12 @@ class MeasureTimeData
3334
MeasureTimeValues *sumMeasuredValues;
3435
//MeasureTimeValues *maxMeasuredValues;
3536
unsigned int numCalcs;
36-
std::string category;
37-
3837

3938
MeasureTimeData();
4039
virtual ~MeasureTimeData();
4140

41+
std::string serializeToJson() const;
42+
4243
void addValuesToSum(MeasureTimeValues *values);
4344
};
4445

@@ -47,7 +48,8 @@ class MeasureTime
4748
public:
4849
typedef void (*getTimeValuesFctType)(MeasureTimeValues*);
4950

50-
MeasureTime();
51+
typedef std::map<std::string, const std::vector<MeasureTimeData> *> block_map;
52+
typedef std::map<std::string, block_map> file_map;
5153

5254
virtual ~MeasureTime();
5355

@@ -61,24 +63,35 @@ class MeasureTime
6163
* - always inline -> effect
6264
* - measure overhead and sub the values -> effect
6365
*/
64-
static inline void getTimeValues(MeasureTimeValues *res) //__attribute__((always_inline))
66+
static inline void getTimeValuesStart(MeasureTimeValues *res) //__attribute__((always_inline))
6567
{
66-
getTimeValuesFct(res);
68+
getTimeValuesStartFct(res);
69+
}
70+
71+
static inline void getTimeValuesEnd(MeasureTimeValues *res)
72+
{
73+
getTimeValuesEndFct(res);
6774
}
6875

6976
static MeasureTimeValues* getZeroValues();
7077

7178
static void deinitialize();
7279

73-
void writeTimeToJason(std::string model_name, std::vector<MeasureTimeData> data);
80+
static void addJsonContentBlock(const std::string filename, const std::string blockname, const std::vector<MeasureTimeData> * in);
81+
82+
static void writeToJson();
7483

7584
virtual void benchOverhead();
7685

7786
protected:
78-
static MeasureTime *instance;
79-
static getTimeValuesFctType getTimeValuesFct;
8087

81-
MeasureTimeValues *overhead;
88+
static MeasureTime * instance;
89+
static getTimeValuesFctType getTimeValuesStartFct, getTimeValuesEndFct;
90+
static file_map toWrite;
91+
92+
MeasureTimeValues * overhead;
93+
94+
MeasureTime();
8295

8396
virtual MeasureTimeValues* getZeroValuesP() = 0;
8497
};

SimulationRuntime/cpp/Include/Core/Utils/extension/measure_time_rdtsc.hpp

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,12 @@ class MeasureTimeValuesRDTSC : public MeasureTimeValues
88
public:
99
unsigned long long time;
1010

11+
unsigned long long max_time;
12+
1113
MeasureTimeValuesRDTSC(unsigned long long time);
1214
virtual ~MeasureTimeValuesRDTSC();
1315

14-
virtual std::string serializeToJson();
16+
virtual std::string serializeToJson() const;
1517

1618
virtual void add(MeasureTimeValues *values);
1719
virtual void sub(MeasureTimeValues *values);
@@ -31,10 +33,14 @@ class MeasureTimeRDTSC : public MeasureTime
3133
static void initialize()
3234
{
3335
instance = new MeasureTimeRDTSC();
34-
MeasureTime::getTimeValuesFct = &MeasureTimeRDTSC::getTimeValues;
36+
MeasureTime::getTimeValuesStartFct = &MeasureTimeRDTSC::getTimeValuesStart;
37+
MeasureTime::getTimeValuesEndFct = &MeasureTimeRDTSC::getTimeValuesEnd;
3538
instance->benchOverhead();
3639
}
37-
static void getTimeValues(MeasureTimeValues *res);
40+
41+
static void getTimeValuesStart(MeasureTimeValues *res);
42+
43+
static void getTimeValuesEnd(MeasureTimeValues *res);
3844

3945
private:
4046
static inline unsigned long long RDTSC(); //__attribute__((always_inline));

0 commit comments

Comments
 (0)