Skip to content

Commit

Permalink
- added new profiling points to c++ runtime
Browse files Browse the repository at this point in the history
- improved compile performance
  • Loading branch information
Marcus Walther authored and OpenModelica-Hudson committed Jun 1, 2015
1 parent 2ad8c89 commit 5ec662e
Show file tree
Hide file tree
Showing 6 changed files with 131 additions and 214 deletions.
217 changes: 32 additions & 185 deletions Compiler/Template/CodegenCpp.tpl

Large diffs are not rendered by default.

4 changes: 0 additions & 4 deletions Compiler/Template/CodegenCppHpcom.tpl
Expand Up @@ -86,10 +86,6 @@ template translateModel(SimCode simCode)
let alg = algloopfiles(listAppend(allEquations,initialEquations), simCode, &extraFuncs, &extraFuncsDecl, "", contextAlgloop, stateDerVectorName, false)
let() = textFile(algloopMainfile(listAppend(allEquations,initialEquations), simCode, &extraFuncs, &extraFuncsDecl, "", contextAlgloop), 'OMCpp<%fileNamePrefix%>AlgLoopMain.cpp')
let() = textFile(calcHelperMainfile(simCode, &extraFuncs, &extraFuncsDecl, ""), 'OMCpp<%fileNamePrefix%>CalcHelperMain.cpp')
let() = textFile(calcHelperMainfile2(simCode, &extraFuncs, &extraFuncsDecl, ""), 'OMCpp<%fileNamePrefix%>CalcHelperMain2.cpp')
let() = textFile(calcHelperMainfile3(simCode, &extraFuncs, &extraFuncsDecl, ""), 'OMCpp<%fileNamePrefix%>CalcHelperMain3.cpp')
let() = textFile(calcHelperMainfile4(simCode, &extraFuncs, &extraFuncsDecl, ""), 'OMCpp<%fileNamePrefix%>CalcHelperMain4.cpp')
let() = textFile(calcHelperMainfile5(simCode, &extraFuncs, &extraFuncsDecl, ""), 'OMCpp<%fileNamePrefix%>CalcHelperMain5.cpp')
""
// empty result of the top-level template .., only side effects
end match
Expand Down
67 changes: 48 additions & 19 deletions Compiler/Template/CodegenFMUCpp.tpl
Expand Up @@ -70,18 +70,63 @@ case SIMCODE(modelInfo=modelInfo as MODELINFO(__)) then
let()= textFile(fmuModelDescriptionFileCpp(simCode, extraFuncs, extraFuncsDecl, "", guid, FMUVersion, FMUType), 'modelDescription.xml')
let()= textFile(fmudeffile(simCode, FMUVersion), '<%fileNamePrefix%>.def')
let()= textFile(fmuMakefile(target,simCode, extraFuncs, extraFuncsDecl, "", FMUVersion), '<%fileNamePrefix%>_FMU.makefile')
let()= textFile(fmuCalcHelperMainfile(simCode), 'OMCpp<%fileNamePrefix%>CalcHelperMain.cpp')
""
// Return empty result since result written to files directly
end translateModel;

template fmuCalcHelperMainfile(SimCode simCode)
::=
match simCode
case SIMCODE(modelInfo = MODELINFO(__)) then
<<
/*****************************************************************************
*
* Helper file that includes all generated calculation files, except the alg loops.
* This file is generated by the OpenModelica Compiler and produced to speed-up the compile time.
*
*****************************************************************************/
#include <Core/ModelicaDefine.h>
#include <Core/Modelica.h>
#include <Core/System/FactoryExport.h>
#include <Core/DataExchange/SimData.h>
#include <Core/System/SimVars.h>
#include <Core/System/DiscreteEvents.h>
#include <Core/System/EventHandling.h>

#include "OMCpp<%fileNamePrefix%>Types.h"
#include "OMCpp<%fileNamePrefix%>.h"
#include "OMCpp<%fileNamePrefix%>Functions.h"
#include "OMCpp<%fileNamePrefix%>Jacobian.h"
#include "OMCpp<%fileNamePrefix%>StateSelection.h"
#include "OMCpp<%fileNamePrefix%>WriteOutput.h"
#include "OMCpp<%fileNamePrefix%>Initialize.h"
#include "OMCpp<%fileNamePrefix%>Extension.h"
#include "OMCpp<%fileNamePrefix%>FMU.h"

#include "OMCpp<%fileNamePrefix%>AlgLoopMain.cpp"
#include "OMCpp<%fileNamePrefix%>FactoryExport.cpp"
#include "OMCpp<%fileNamePrefix%>Extension.cpp"
#include "OMCpp<%fileNamePrefix%>Functions.cpp"
#include "OMCpp<%fileNamePrefix%>InitializeParameter.cpp"
#include "OMCpp<%fileNamePrefix%>InitializeAlgVars.cpp"
#include "OMCpp<%fileNamePrefix%>InitializeAliasVars.cpp"
#include "OMCpp<%fileNamePrefix%>InitializeExtVars.cpp"
#include "OMCpp<%fileNamePrefix%>Initialize.cpp"
#include "OMCpp<%fileNamePrefix%>Jacobian.cpp"
#include "OMCpp<%fileNamePrefix%>StateSelection.cpp"
#include "OMCpp<%fileNamePrefix%>.cpp"
#include "OMCpp<%fileNamePrefix%>FMU.cpp"
>>
end fmuCalcHelperMainfile;

template fmuWriteOutputHeaderFile(SimCode simCode ,Text& extraFuncs,Text& extraFuncsDecl,Text extraFuncsNamespace)
"Overrides code for writing simulation file. FMU does not write an output file"
::=
match simCode
case SIMCODE(modelInfo=MODELINFO(__),simulationSettingsOpt = SOME(settings as SIMULATION_SETTINGS(__))) then
<<
#pragma once
#include <Core/Modelica.h>

// Dummy code for FMU that writes no output file
class <%lastIdentOfPath(modelInfo.name)%>WriteOutput {
Expand Down Expand Up @@ -170,7 +215,6 @@ case SIMCODE(modelInfo=MODELINFO(__)) then
//let modelIdentifier = System.stringReplace(dotPath(modelInfo.name), ".", "_")
<<
// declaration for Cpp FMU target
#include "OMCpp<%fileNamePrefix%>Extension.h"

class <%modelIdentifier%>FMU: public <%modelIdentifier%>Extension {
public:
Expand Down Expand Up @@ -213,20 +257,9 @@ case SIMCODE(modelInfo=MODELINFO(__)) then
<<
// define model identifier and unique id
#define MODEL_IDENTIFIER <%modelIdentifier%>
#define MODEL_SIMVARS_FACTORY <%modelIdentifier%>FMU::createSimVars
#define MODEL_GUID "{<%guid%>}"

#include <Core/Modelica.h>
#include <Core/ModelicaDefine.h>
#include <System/IMixedSystem.h>
#include <SimulationSettings/IGlobalSettings.h>
#include <System/IAlgLoopSolverFactory.h>
#include <System/IMixedSystem.h>
#include <System/IAlgLoop.h>
#include <Solver/IAlgLoopSolver.h>
#include <System/IAlgLoopSolverFactory.h>
#include <SimController/ISimData.h>
#include "OMCpp<%fileNamePrefix%>FMU.h"

<%ModelDefineData(modelInfo)%>
#define NUMBER_OF_EVENT_INDICATORS <%zerocrosslength(simCode, extraFuncs ,extraFuncsDecl, extraFuncsNamespace)%>

Expand Down Expand Up @@ -745,10 +778,6 @@ case SIMCODE(modelInfo=MODELINFO(__), makefileParams=MAKEFILE_PARAMS(__), simula
PLATFORM="<%platformstr%>"

CALCHELPERMAINFILE=OMCpp<%fileNamePrefix%>CalcHelperMain.cpp
CALCHELPERMAINFILE2=OMCpp<%fileNamePrefix%>CalcHelperMain2.cpp
CALCHELPERMAINFILE3=OMCpp<%fileNamePrefix%>CalcHelperMain3.cpp
#skip CALCHELPERMAINFILE4 with WriteOutput
CALCHELPERMAINFILE5=OMCpp<%fileNamePrefix%>CalcHelperMain5.cpp
ALGLOOPSMAINFILE=OMCpp<%fileNamePrefix%>AlgLoopMain.cpp

OMCPP_LIBS= -lOMCppSystem_FMU -lOMCppDataExchange_static -lOMCppOMCFactory -lOMCppMath_static
Expand All @@ -757,7 +786,7 @@ case SIMCODE(modelInfo=MODELINFO(__), makefileParams=MAKEFILE_PARAMS(__), simula
BOOST_LIBRARIES = -lboost_system -lboost_filesystem -lboost_program_options
LIBS= $(OMCPP_LIBS) $(OMCPP_SOLVER_LIBS) $(MODELICA_EXTERNAL_LIBS) $(BASE_LIB) $(BOOST_LIBRARIES) $(LINUX_LIB_DL)

CPPFILES=OMCpp<%fileNamePrefix%>.cpp OMCpp<%fileNamePrefix%>FMU.cpp $(CALCHELPERMAINFILE) $(CALCHELPERMAINFILE2) $(CALCHELPERMAINFILE3) $(CALCHELPERMAINFILE5) $(ALGLOOPSMAINFILE)
CPPFILES=$(CALCHELPERMAINFILE)
OFILES=$(CPPFILES:.cpp=.o)

.PHONY: <%modelName%>.fmu $(CPPFILES) clean
Expand Down
46 changes: 44 additions & 2 deletions SimulationRuntime/cpp/Core/SimController/SimController.cpp
Expand Up @@ -18,12 +18,28 @@ SimController::SimController(PATH library_path, PATH modelicasystem_path)
{
_config = boost::shared_ptr<Configuration>(new Configuration(_library_path, _config_path, modelicasystem_path));
_algloopsolverfactory = createAlgLoopSolverFactory(_config->getGlobalSettings());

#ifdef RUNTIME_PROFILING
if(MeasureTime::getInstance() != NULL)
{
measureTimeFunctionsArray = std::vector<MeasureTimeData>(2); //0 initialize //1 solveInitialSystem
measuredFunctionStartValues = MeasureTime::getZeroValues();
measuredFunctionEndValues = MeasureTime::getZeroValues();

measureTimeFunctionsArray[0] = MeasureTimeData("initialize");
measureTimeFunctionsArray[1] = MeasureTimeData("solveInitialSystem");
}
#endif
}

SimController::~SimController()
{
// _systems.clear();
// _sim_vars.clear();
#ifdef RUNTIME_PROFILING
if(measuredFunctionStartValues)
delete measuredFunctionStartValues;
if(measuredFunctionEndValues)
delete measuredFunctionEndValues;
#endif
}

boost::weak_ptr<IMixedSystem> SimController::LoadSystem(string modelLib,string modelKey)
Expand Down Expand Up @@ -199,6 +215,14 @@ void SimController::Start(SimSettings simsettings, string modelKey)
{
try
{
#ifdef RUNTIME_PROFILING
MEASURETIME_REGION_DEFINE(simControllerInitializeHandler, "SimControllerInitialize");
MEASURETIME_REGION_DEFINE(simControllerSolveInitialSystemHandler, "SimControllerSolveInitialSystem");
if(MeasureTime::getInstance() != NULL)
{
MEASURETIME_START(measuredFunctionStartValues, simControllerInitializeHandler, "CVodeWriteOutput");
}
#endif
boost::shared_ptr<IMixedSystem> mixedsystem = getSystem(modelKey).lock();

IGlobalSettings* global_settings = _config->getGlobalSettings();
Expand All @@ -223,8 +247,26 @@ void SimController::Start(SimSettings simsettings, string modelKey)
solver_settings->setUpperLimit(simsettings.upper_limit);
solver_settings->setRTol(simsettings.tolerance);
solver_settings->setATol(simsettings.tolerance);
#ifdef RUNTIME_PROFILING
if(MeasureTime::getInstance() != NULL)
{
MEASURETIME_END(measuredFunctionStartValues, measuredFunctionEndValues, measureTimeFunctionsArray[0], simControllerInitializeHandler);
measuredFunctionStartValues = MeasureTime::getZeroValues();
measuredFunctionEndValues = MeasureTime::getZeroValues();
MEASURETIME_START(measuredFunctionStartValues, simControllerSolveInitialSystemHandler, "SolveInitialSystem");
}
#endif

_simMgr->initialize();

#ifdef RUNTIME_PROFILING
if(MeasureTime::getInstance() != NULL)
{
MEASURETIME_END(measuredFunctionStartValues, measuredFunctionEndValues, measureTimeFunctionsArray[1], simControllerSolveInitialSystemHandler);
MeasureTime::addResultContentBlock(mixedsystem->getModelName(),"simController",&measureTimeFunctionsArray);
}
#endif

_simMgr->runSimulation();

boost::shared_ptr<IWriteOutput> writeoutput_system = boost::dynamic_pointer_cast<IWriteOutput>(mixedsystem);
Expand Down
Expand Up @@ -49,5 +49,10 @@ class SimController : public ISimController,
// for real-time usage (VxWorks and BODAS)
//removed, has to be released after simulation run, see SimController.Start
boost::shared_ptr<SimManager> _simMgr;

#ifdef RUNTIME_PROFILING
std::vector<MeasureTimeData> measureTimeFunctionsArray;
MeasureTimeValues *measuredFunctionStartValues, *measuredFunctionEndValues;
#endif
};
/** @} */ // end of coreSimcontroller
/** @} */ // end of coreSimcontroller
4 changes: 1 addition & 3 deletions SimulationRuntime/cpp/Include/FMU/FMUWrapper.cpp
Expand Up @@ -2,7 +2,6 @@
#include <Core/ModelicaDefine.h>
#include <Core/Modelica.h>
/*workarround until cmake file is modified*/
#define OMC_BUILD
#include <Core/Solver/ISolverSettings.h>
#include <Core/SimulationSettings//ISettingsFactory.h>
#include <Core/Solver/ISolver.h>
Expand All @@ -20,8 +19,7 @@ FMUWrapper::FMUWrapper(fmiString instanceName, fmiString GUID,
{
boost::shared_ptr<IAlgLoopSolverFactory>
solver_factory(new AlgLoopSolverFactory(&_global_settings,PATH(""),PATH("")));
_model = boost::shared_ptr<MODEL_CLASS>
(new MODEL_CLASS(&_global_settings, solver_factory, boost::shared_ptr<ISimData>(new SimData())));
_model = boost::shared_ptr<MODEL_CLASS>(new MODEL_CLASS(&_global_settings, solver_factory, boost::shared_ptr<ISimData>(new SimData()), boost::shared_ptr<ISimVars>(MODEL_SIMVARS_FACTORY())));
_model->setInitial(true);
_tmp_real_buffer.resize(_model->getDimReal());
_tmp_int_buffer.resize(_model->getDimInteger());
Expand Down

0 comments on commit 5ec662e

Please sign in to comment.