Skip to content

Commit

Permalink
Reduce impact of new internal matrix layout
Browse files Browse the repository at this point in the history
- don't use assignRowMajorData in createArray_* methods because only single-dimensional data is assigned
- this enables to move assignRowMajorData back to the precompiled ArrayOperations.cpp (reverting r25614)


git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@25623 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
  • Loading branch information
rfranke committed Apr 19, 2015
1 parent 69f49b8 commit bdc18ed
Show file tree
Hide file tree
Showing 4 changed files with 59 additions and 51 deletions.
45 changes: 23 additions & 22 deletions Compiler/Template/CodegenCpp.tpl
Expand Up @@ -10784,18 +10784,21 @@ template daeExpMatrix(Exp exp, Context context, Text &preExp, Text &varDecls, Si
let vars = daeExpMatrixRow2(row, context, &varDecls, &preExp, simCode, &extraFuncs, &extraFuncsDecl, extraFuncsNamespace, stateDerVectorName, useFlatArrayNotation)
'<%vars%>'
;separator=",")
let &preExp += '
//default matrix assign
<%StatArrayDim%><%arrayVar%>;
<%arrayTypeStr%> <%arrayVar%>_data[]={<%params%>};
//<%arrayVar%>.assign( <%arrayVar%>_data );
assignRowMajorData(<%arrayVar%>_data, <%arrayVar%>);<%\n%>'
let &preExp +=
<<
//default matrix assign
<%StatArrayDim%> <%arrayVar%>;
<%arrayTypeStr%> <%arrayVar%>_data[] = {<%params%>};
assignRowMajorData(<%arrayVar%>_data, <%arrayVar%>);<%\n%>
>>
''
else
let &preExp += '
//optimized matrix assign/
<%StatArrayDim%><%arrayVar%>;
<%arrayVar%>.assign( <%vars%> );<%\n%>'
let &preExp +=
<<
//optimized matrix assign
<%StatArrayDim%> <%arrayVar%>;
<%arrayVar%>.assign( <%vars%> );<%\n%>
>>
''
end match

Expand Down Expand Up @@ -10916,7 +10919,7 @@ case ARRAY(array=_::_, ty = arraytype) then
>>
<<
<%ArrayType%> <%arrayVar%>;
createArray_<%arrayVar%>(<%arrayVar%>);<%\n%>
createArray_<%arrayVar%>(<%arrayVar%>);<%\n%>
>>


Expand Down Expand Up @@ -10954,12 +10957,11 @@ template daeExpArray2(list<Exp> array,String arrayVar,String ArrayType,String ar
"Generates code for an array expression."
::=
let params = (array |> e => '<%daeExp(e, context, &preExp, &varDecls, simCode, &extraFuncs, &extraFuncsDecl, extraFuncsNamespace, stateDerVectorName, useFlatArrayNotation)%>' ;separator=", ")
let &preExp += <<
<%arrayTypeStr%> <%arrayVar%>_data[]={<%params%>};
//<%ArrayType%> <%arrayVar%>(<%arrayVar%>_data);
<%ArrayType%> <%arrayVar%>;
assignRowMajorData(<%arrayVar%>_data, <%arrayVar%>);<%\n%>
>>
let &preExp +=
<<
<%arrayTypeStr%> <%arrayVar%>_data[]={<%params%>};
<%ArrayType%> <%arrayVar%>(<%arrayVar%>_data);<%\n%>
>>

params
end daeExpArray2;
Expand All @@ -10977,15 +10979,15 @@ let &preExpSubArrays = buffer ""
let funcs = (array |> e hasindex i0 fromindex intAdd(intMul(idx, multiplicator),1) =>
let subArraycall = daeExp(e, context, &preExpSubArrays, &funcVarDecls, simCode, &extraFuncs, &extraFuncsDecl, extraFuncsNamespace, stateDerVectorName, useFlatArrayNotation)
<<
<%arrayVar%>.append(<%i0%>,<%subArraycall%>);
<%arrayVar%>.append(<%i0%>, <%subArraycall%>);
>> ;separator="\n")
let & extraFuncs +=
<<
void <%extraFuncsNamespace%>::createArray_<%arrayVar%>_<%idx%>(<%ArrayType%>& <%arrayVar%>)
{
<%funcVarDecls%>
<%preExpSubArrays%>
<%funcs%>
<%funcVarDecls%>
<%preExpSubArrays%>
<%funcs%>
}
>>
funcCall
Expand Down Expand Up @@ -13069,7 +13071,6 @@ template literalExpConstImpl(Exp lit, Integer index) "These should all be declar
<<
//arrayflats
<%arrayTypeStr%> <%name%>_data[] = {<%data%>};
//<%name%>.assign(<%name%>_data);
assignRowMajorData(<%name%>_data, <%name%>);
>>

Expand Down
29 changes: 29 additions & 0 deletions SimulationRuntime/cpp/Core/Math/ArrayOperations.cpp
Expand Up @@ -374,6 +374,30 @@ void convertIntToBool(BaseArray<int>& a, BaseArray<bool>& b)
}
}

/**
* helper for assignRowMajorData
* recursive function for muli-dimensional assignment of raw data
*/
template <typename S, typename T>
static size_t assignRowMajorDim(size_t dim, const S* data,
BaseArray<T> &array, vector<size_t> idx) {
size_t processed = 0;
size_t size = array.getDim(dim);
for (size_t i = 1; i <= size; i++) {
idx[dim - 1] = i;
if (dim < idx.size())
processed += assignRowMajorDim(dim + 1, data + processed, array, idx);
else
array(idx) = data[processed++];
}
return processed;
}

template <typename S, typename T>
void assignRowMajorData(const S *data, BaseArray<T> &array) {
assignRowMajorDim(1, data, array, vector<size_t>(array.getNumDims()));
}

/**
* helper for convertArrayLayout
* recursive function for changing between row and column major
Expand Down Expand Up @@ -476,6 +500,11 @@ template std::pair <bool,bool> BOOST_EXTENSION_EXPORT_DECL min_max (BaseArray<bo
void BOOST_EXTENSION_EXPORT_DECL convertBoolToInt( BaseArray<bool> & a ,BaseArray<int> & b );
void BOOST_EXTENSION_EXPORT_DECL convertIntToBool( BaseArray<int> & a ,BaseArray<bool> & b );

template void BOOST_EXTENSION_EXPORT_DECL assignRowMajorData(const double *data, BaseArray<double> &d);
template void BOOST_EXTENSION_EXPORT_DECL assignRowMajorData(const int *data, BaseArray<int> &d);
template void BOOST_EXTENSION_EXPORT_DECL assignRowMajorData(const bool *data, BaseArray<bool> &d);
template void BOOST_EXTENSION_EXPORT_DECL assignRowMajorData(const string *data, BaseArray<string> &d);

/*
template class BOOST_EXTENSION_EXPORT_DECL StatArrayDim1<double, 3>;
template class BOOST_EXTENSION_EXPORT_DECL StatArrayDim1<double, 4> ;
Expand Down
29 changes: 0 additions & 29 deletions SimulationRuntime/cpp/Include/Core/Math/Array.h
Expand Up @@ -2427,32 +2427,3 @@ throw ModelicaSimulationError(MODEL_ARRAY_FUNCTION, "error in assing array: Arra
std::transform(otherArray._ref_array_data.c_array(),otherArray._ref_array_data.c_array() +size1*size2,_ref_array_data.c_array(),AssignArrayVarToArrayVar<T>());
*/

/**
* Helper for assignRowMajorData
* Recursive treatment of an arbitrary number of dimensions
*/
template <typename S, typename T>
static size_t assignRowMajorDim(size_t dim, const S* data,
BaseArray<T> &array, vector<size_t> idx) {
size_t processed = 0;
size_t ndims = idx.size();
size_t size = array.getDim(dim);
for (size_t i = 1; i <= size; i++) {
idx[dim - 1] = i;
if (dim < ndims)
processed += assignRowMajorDim(dim + 1, data + processed, array, idx);
else
array(idx) = data[processed++];
}
return processed;
}

/**
* Assign data with row major order to BaseArray with arbitrary storage layout,
* including optional type conversion if supported in assignment from S to T.
*/
template <typename S, typename T>
void assignRowMajorData(const S *data, BaseArray<T> &array) {
assignRowMajorDim(1, data, array, vector<size_t>(array.getNumDims()));
}
7 changes: 7 additions & 0 deletions SimulationRuntime/cpp/Include/Core/Math/ArrayOperations.h
Expand Up @@ -92,3 +92,10 @@ void cross_array( BaseArray<T> & a ,BaseArray<T> & b, BaseArray<T> & res );

void BOOST_EXTENSION_EXPORT_DECL convertBoolToInt( BaseArray<bool> & a ,BaseArray<int> & b );
void BOOST_EXTENSION_EXPORT_DECL convertIntToBool( BaseArray<int> & a ,BaseArray<bool> & b );

/**
* assign data with row major order to BaseArray with arbitrary storage layout,
* including optional type conversion if supported in assignment from S to T
*/
template <typename S, typename T>
void assignRowMajorData(const S *data, BaseArray<T> &array);

0 comments on commit bdc18ed

Please sign in to comment.