Skip to content
This repository has been archived by the owner on May 18, 2019. It is now read-only.

Commit

Permalink
Improve scalability for binding equations
Browse files Browse the repository at this point in the history
When using an optimizing C-compiler, the huge number of binding
equations in for example the 4-bit binary adder example becomes the
bottleneck. This splits these into multiple files and disables
optimization for the wrapper functions.
  • Loading branch information
sjoelund authored and OpenModelica-Hudson committed Oct 10, 2017
1 parent 38a9013 commit 6138df4
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 24 deletions.
53 changes: 30 additions & 23 deletions Compiler/Template/CodegenC.tpl
Original file line number Diff line number Diff line change
Expand Up @@ -659,7 +659,7 @@ template simulationFile_bnd(SimCode simCode)
<%functionUpdateBoundVariableAttributes(simCode, startValueEquations, nominalValueEquations, minValueEquations, maxValueEquations, modelNamePrefix(simCode))%>
<%functionUpdateBoundParameters(parameterEquations, modelNamePrefix(simCode))%>
<%functionUpdateBoundParameters(parameterEquations, simCode.fileNamePrefix, simCode.fullPathPrefix, modelNamePrefix(simCode))%>
#if defined(__cplusplus)
}
Expand Down Expand Up @@ -2935,43 +2935,36 @@ template functionUpdateBoundVariableAttributes(SimCode simCode, list<SimEqSystem
>>
end functionUpdateBoundVariableAttributes;
template functionUpdateBoundParameters(list<SimEqSystem> parameterEquations, String modelNamePrefix)
template functionUpdateBoundParameters(list<SimEqSystem> parameterEquations, String fileNamePrefix, String fullPathPrefix, String modelNamePrefix)
"Generates function in simulation file."
::=
let &eqFuncs = buffer ""
let fncalls = functionEquationsMultiFiles(parameterEquations, listLength(parameterEquations), intMul(6 /* Binding equations are small */, Flags.getConfigInt(Flags.EQUATIONS_PER_FILE)), fileNamePrefix, fullPathPrefix, modelNamePrefix, "updateBoundParameters", "08bnd", &eqFuncs)
<<
<%(parameterEquations |> eq => equation_impl(-1, eq, contextSimulationDiscrete, modelNamePrefix) ; separator="\n")%>
<%eqFuncs%>
OMC_DISABLE_OPT
int <%symbolName(modelNamePrefix,"updateBoundParameters")%>(DATA *data, threadData_t *threadData)
{
TRACE_PUSH
<%(parameterEquations |> eq => equation_call(eq, modelNamePrefix) ; separator="\n")%>
<%fncalls%>
TRACE_POP
return 0;
}
>>
end functionUpdateBoundParameters;
template functionInitialEquations(list<SimEqSystem> initalEquations, Integer numInitialEquations, String fileNamePrefix, String fullPathPrefix, String modelNamePrefix)
"Generates function in simulation file."
template functionEquationsMultiFiles(list<SimEqSystem> inEqs, Integer numEqs, Integer equationsPerFile, String fileNamePrefix, String fullPathPrefix, String modelNamePrefix, String funcName, String partName, Text &eqFuncs)
::=
let () = System.tmpTickReset(0)
let nrfuncs = listLength(initalEquations)
let &eqfuncs = buffer ""
let &eqArray = buffer ""
let &file = buffer ""
let multiFile = if intGt(numInitialEquations, Flags.getConfigInt(Flags.EQUATIONS_PER_FILE)) then "x"
let fncalls = if Flags.isSet(Flags.PARMODAUTO) then
(initalEquations |> eq hasindex i0 =>
equation_arrayFormat(eq, "InitialEquations", contextSimulationDiscrete, i0, &eqArray, &eqfuncs, modelNamePrefix)
;separator="\n")
else
(List.balancedPartition(initalEquations,Flags.getConfigInt(Flags.EQUATIONS_PER_FILE)) |> eqs hasindex i0 =>
let name = symbolName(modelNamePrefix,'functionInitialEquations_<%i0%>')
let &eqfuncs += 'void <%name%>(DATA *data, threadData_t *threadData);<%\n%>'
let multiFile = if intGt(numEqs, equationsPerFile) then "x"
let fncalls = (List.balancedPartition(inEqs, equationsPerFile) |> eqs hasindex i0 =>
let name = symbolName(modelNamePrefix,'<%funcName%>_<%i0%>')
let &eqFuncs += 'void <%name%>(DATA *data, threadData_t *threadData);<%\n%>'
// To file
let &file += ((if multiFile then
(let fileName = addFunctionIndex('<%fileNamePrefix%>_06inz_part', ".c")
(let fileName = addFunctionIndex('<%fileNamePrefix%>_<%partName%>_part', ".c")
redirectToFile(fullPathPrefix + fileName) +
<<
<%simulationFileHeader(fileNamePrefix)%>
Expand All @@ -2981,6 +2974,7 @@ template functionInitialEquations(list<SimEqSystem> initalEquations, Integer num
>>)) +
(eqs |> eq => equation_impl(-1, eq, contextSimulationDiscrete, modelNamePrefix) ; separator="\n") +
<<
OMC_DISABLE_OPT
<%\n%>void <%name%>(DATA *data, threadData_t *threadData)
{
TRACE_PUSH
Expand All @@ -3003,6 +2997,21 @@ template functionInitialEquations(list<SimEqSystem> initalEquations, Integer num
)
let &eqFuncs += file
fncalls
end functionEquationsMultiFiles;
template functionInitialEquations(list<SimEqSystem> initalEquations, Integer numInitialEquations, String fileNamePrefix, String fullPathPrefix, String modelNamePrefix)
"Generates function in simulation file."
::=
let () = System.tmpTickReset(0)
let &eqfuncs = buffer ""
let &eqArray = buffer ""
let fncalls = if Flags.isSet(Flags.PARMODAUTO) then
(initalEquations |> eq hasindex i0 =>
equation_arrayFormat(eq, "InitialEquations", contextSimulationDiscrete, i0, &eqArray, &eqfuncs, modelNamePrefix)
;separator="\n")
else functionEquationsMultiFiles(initalEquations, numInitialEquations, Flags.getConfigInt(Flags.EQUATIONS_PER_FILE), fileNamePrefix, fullPathPrefix, modelNamePrefix, "functionInitialEquations", "06inz", &eqfuncs)
let eqArrayDecl = if Flags.isSet(Flags.PARMODAUTO) then
<<
static void (*functionInitialEquations_systems[<%listLength(initalEquations)%>])(DATA *, threadData_t*) = {
Expand All @@ -3015,16 +3024,14 @@ template functionInitialEquations(list<SimEqSystem> initalEquations, Integer num
<<
<%eqfuncs%>
<%file%>
<%eqArrayDecl%>
int <%symbolName(modelNamePrefix,"functionInitialEquations")%>(DATA *data, threadData_t *threadData)
{
TRACE_PUSH
data->simulationInfo->discreteCall = 1;
<%if Flags.isSet(Flags.PARMODAUTO) then 'PM_functionInitialEquations(<%nrfuncs%>, data, threadData, functionInitialEquations_systems);'
<%if Flags.isSet(Flags.PARMODAUTO) then 'PM_functionInitialEquations(<%numInitialEquations%>, data, threadData, functionInitialEquations_systems);'
else fncalls %>
data->simulationInfo->discreteCall = 0;
Expand Down
2 changes: 1 addition & 1 deletion Compiler/Template/CodegenFMU.tpl
Original file line number Diff line number Diff line change
Expand Up @@ -2941,7 +2941,7 @@ case SIMCODE(modelInfo = MODELINFO(functions = functions, varInfo = vi as VARINF
<<
#include <simulation_data.h>

__attribute__((optimize(0),optnone))<%/* This function is very simple and doesn't need to be optimized. GCC/clang spend way too much time looking at it. */%>
OMC_DISABLE_OPT<%/* This function is very simple and doesn't need to be optimized. GCC/clang spend way too much time looking at it. */%>
void <%symbolName(modelNamePrefix(simCode),"read_input_fmu")%>(MODEL_DATA* modelData, SIMULATION_INFO* simulationInfo)
{
simulationInfo->startTime = <%s.startTime%>;
Expand Down
6 changes: 6 additions & 0 deletions SimulationRuntime/c/openmodelica.h
Original file line number Diff line number Diff line change
Expand Up @@ -178,6 +178,12 @@ static inline int sign(double v)
#define OMC_LABEL_UNUSED __attribute__((unused))
#endif

#if defined(__clang__)
#define OMC_DISABLE_OPT __attribute__((optnone))
#elif defined(__GNUC__)
#define OMC_DISABLE_OPT __attribute__((optimize(0)))
#endif

#if defined(__cplusplus)
} /* end extern "C" */
#endif
Expand Down

0 comments on commit 6138df4

Please sign in to comment.