Kaydet (Commit) e0e21f27 authored tarafından Luboš Luňák's avatar Luboš Luňák

clean up calc'c choosing between threading and OpenCL

Now there's just one place to decide what is used first,
in InterpretFormulaGroup(). Place in other places now checks both threading
and OpenCL, which should be cheap, but it also allows e.g. falling
back from OpenCL to threading if it doesn't work out for a specific
formula group.

Change-Id: I0cac55197c5278174d303691c20f77b842995c84
Reviewed-on: https://gerrit.libreoffice.org/55885Reviewed-by: 's avatarMichael Meeks <michael.meeks@collabora.com>
Tested-by: Jenkins
üst f07cc44b
......@@ -27,6 +27,7 @@
#include "types.hxx"
#include "interpretercontext.hxx"
#include "formulalogger.hxx"
#include "formularesult.hxx"
namespace sc {
......@@ -140,6 +141,11 @@ private:
const sc::RefUpdateContext& rCxt, ScDocument* pUndoDoc, const ScAddress* pUndoCellPos );
ScFormulaCell( const ScFormulaCell& ) = delete;
bool InterpretFormulaGroupThreading(sc::FormulaLogger::GroupScope& aScope);
bool InterpretFormulaGroupOpenCL(sc::FormulaLogger::GroupScope& aScope);
bool InterpretInvariantFormulaGroup();
public:
......@@ -417,7 +423,6 @@ public:
CompareState CompareByTokenArray( const ScFormulaCell& rOther ) const;
bool InterpretFormulaGroup();
bool InterpretInvariantFormulaGroup();
// nOnlyNames may be one or more of SC_LISTENING_NAMES_*
void StartListeningTo( ScDocument* pDoc );
......
......@@ -4385,8 +4385,6 @@ bool ScFormulaCell::InterpretFormulaGroup()
return false;
}
static const bool bThreadingProhibited = std::getenv("SC_NO_THREADED_CALCULATION");
// To temporarily use threading for sc unit tests regardless of the size of the formula group,
// add the condition !std::getenv("LO_TESTNAME") below (with &&)
if (GetWeight() < ScInterpreter::GetGlobalConfig().mnOpenCLMinimumFormulaGroupSize)
......@@ -4409,7 +4407,25 @@ bool ScFormulaCell::InterpretFormulaGroup()
// ScFormulaCell::InterpretTail()
RecursionCounter aRecursionCounter( pDocument->GetRecursionHelper(), this);
if (!bThreadingProhibited && !ScCalcConfig::isOpenCLEnabled() &&
// Preference order:
// First try OpenCL, but only if actual OpenCL is available (i.e. no SwInterpreter).
// Then try threading and as the last one try SwInterpreter.
if( ScCalcConfig::isOpenCLEnabled())
if( InterpretFormulaGroupOpenCL(aScope))
return true;
if( InterpretFormulaGroupThreading(aScope))
return true;
return InterpretFormulaGroupOpenCL(aScope);
}
// To be called only from InterpretFormulaGroup().
bool ScFormulaCell::InterpretFormulaGroupThreading(sc::FormulaLogger::GroupScope& aScope)
{
static const bool bThreadingProhibited = std::getenv("SC_NO_THREADED_CALCULATION");
if (!bThreadingProhibited &&
pCode->IsEnabledForThreading() &&
ScCalcConfig::isThreadingEnabled())
{
......@@ -4519,6 +4535,12 @@ bool ScFormulaCell::InterpretFormulaGroup()
return true;
}
return false;
}
// To be called only from InterpretFormulaGroup().
bool ScFormulaCell::InterpretFormulaGroupOpenCL(sc::FormulaLogger::GroupScope& aScope)
{
bool bCanVectorize = pCode->IsEnabledForOpenCL();
switch (pCode->GetVectorState())
{
......
......@@ -1325,9 +1325,6 @@ void ScTokenArray::CheckForThreading( OpCode eOp )
ocExternal
});
// We only call this if it was already disabled
assert(IsFormulaVectorDisabled());
// Don't enable threading once we decided to disable it.
if (!mbThreadingEnabled)
return;
......@@ -1342,9 +1339,6 @@ void ScTokenArray::CheckForThreading( OpCode eOp )
<< "(" << int(eOp) << ") disables threaded calculation of formula group");
mbThreadingEnabled = false;
}
else
SAL_INFO("sc.core.formulagroup", "but enabling for threading instead");
}
else
mbThreadingEnabled = false;
......@@ -1352,16 +1346,14 @@ void ScTokenArray::CheckForThreading( OpCode eOp )
void ScTokenArray::CheckToken( const FormulaToken& r )
{
if (IsFormulaVectorDisabled())
{
if (mbThreadingEnabled)
CheckForThreading(r.GetOpCode());
// It's already disabled. No more checking needed.
return;
}
OpCode eOp = r.GetOpCode();
if (mbThreadingEnabled)
CheckForThreading(eOp);
if (IsFormulaVectorDisabled())
return; // It's already disabled. No more checking needed.
if (SC_OPCODE_START_FUNCTION <= eOp && eOp < SC_OPCODE_STOP_FUNCTION)
{
if (ScInterpreter::GetGlobalConfig().mbOpenCLSubsetOnly &&
......@@ -1371,7 +1363,6 @@ void ScTokenArray::CheckToken( const FormulaToken& r )
<< "(" << int(eOp) << ") disables vectorisation for formula group");
meVectorState = FormulaVectorDisabledNotInSubSet;
mbOpenCLEnabled = false;
CheckForThreading(eOp);
return;
}
......@@ -1385,7 +1376,6 @@ void ScTokenArray::CheckToken( const FormulaToken& r )
<< "(" << int(eOp) << ") disables S/W interpreter for formula group");
meVectorState = FormulaVectorDisabledNotInSoftwareSubset;
mbOpenCLEnabled = false;
CheckForThreading(eOp);
return;
}
......@@ -1571,6 +1561,7 @@ void ScTokenArray::CheckToken( const FormulaToken& r )
<< "(" << int(eOp) << ") disables vectorisation for formula group");
meVectorState = FormulaVectorDisabledByOpCode;
mbOpenCLEnabled = false;
return;
}
}
else if (eOp == ocPush)
......@@ -1611,8 +1602,7 @@ void ScTokenArray::CheckToken( const FormulaToken& r )
SAL_INFO("sc.opencl", "opcode ocPush: variable type " << StackVarEnumToString(r.GetType()) << " disables vectorisation for formula group");
meVectorState = FormulaVectorDisabledByStackVariable;
mbOpenCLEnabled = false;
CheckForThreading(eOp);
break;
return;
default:
;
}
......@@ -1626,7 +1616,7 @@ void ScTokenArray::CheckToken( const FormulaToken& r )
<< "(" << int(eOp) << ") disables vectorisation for formula group");
meVectorState = FormulaVectorDisabledNotInSubSet;
mbOpenCLEnabled = false;
CheckForThreading(eOp);
return;
}
// only when openCL interpreter is not enabled - the assumption is that
// the S/W interpreter blacklist is more strict
......@@ -1638,7 +1628,7 @@ void ScTokenArray::CheckToken( const FormulaToken& r )
<< "(" << int(eOp) << ") disables S/W interpreter for formula group");
meVectorState = FormulaVectorDisabledNotInSoftwareSubset;
mbOpenCLEnabled = false;
CheckForThreading(eOp);
return;
}
}
else
......@@ -1674,8 +1664,7 @@ void ScTokenArray::CheckToken( const FormulaToken& r )
<< "(" << int(eOp) << ") disables vectorisation for formula group");
meVectorState = FormulaVectorDisabledByOpCode;
mbOpenCLEnabled = false;
CheckForThreading(eOp);
break;
return;
// Known good, don't change state.
case ocStop:
......@@ -1827,18 +1816,9 @@ void ScTokenArray::GenHash()
void ScTokenArray::ResetVectorState()
{
if(ScCalcConfig::isOpenCLEnabled())
{
meVectorState = FormulaVectorEnabled;
mbOpenCLEnabled = true;
mbThreadingEnabled = false;
}
else
{
meVectorState = FormulaVectorDisabled;
mbOpenCLEnabled = false;
mbThreadingEnabled = ScCalcConfig::isThreadingEnabled();
}
mbOpenCLEnabled = ScCalcConfig::isOpenCLEnabled() || ScCalcConfig::isSwInterpreterEnabled();
meVectorState = mbOpenCLEnabled ? FormulaVectorEnabled : FormulaVectorDisabled;
mbThreadingEnabled = ScCalcConfig::isThreadingEnabled();
}
bool ScTokenArray::IsFormulaVectorDisabled() const
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment