Kaydet (Commit) 20ed6886 authored tarafından Kohei Yoshida's avatar Kohei Yoshida

Allow easy toggling of threaded OpenCL kernel compilation.

Via compiler defined macro.

Change-Id: Ic20e6564d99e8ae80c15eda5d12b4dbb76ffbd36
üst 53251377
...@@ -76,6 +76,7 @@ struct SC_DLLPUBLIC ScFormulaCellGroup : boost::noncopyable ...@@ -76,6 +76,7 @@ struct SC_DLLPUBLIC ScFormulaCellGroup : boost::noncopyable
void setCode( const ScTokenArray& rCode ); void setCode( const ScTokenArray& rCode );
void compileCode( void compileCode(
ScDocument& rDoc, const ScAddress& rPos, formula::FormulaGrammar::Grammar eGram ); ScDocument& rDoc, const ScAddress& rPos, formula::FormulaGrammar::Grammar eGram );
void compileOpenCLKernel();
static int snCount; static int snCount;
static rtl::Reference<sc::CLBuildKernelThread> sxCompilationThread; static rtl::Reference<sc::CLBuildKernelThread> sxCompilationThread;
......
...@@ -107,7 +107,7 @@ class SC_DLLPUBLIC FormulaGroupInterpreter ...@@ -107,7 +107,7 @@ class SC_DLLPUBLIC FormulaGroupInterpreter
virtual ScMatrixRef inverseMatrix(const ScMatrix& rMat) = 0; virtual ScMatrixRef inverseMatrix(const ScMatrix& rMat) = 0;
virtual CompiledFormula* createCompiledFormula(ScDocument& rDoc, virtual CompiledFormula* createCompiledFormula(ScDocument& rDoc,
const ScAddress& rTopPos, const ScAddress& rTopPos,
ScFormulaCellGroupRef& xGroup, ScFormulaCellGroup& rGroup,
ScTokenArray& rCode) = 0; ScTokenArray& rCode) = 0;
virtual bool interpret(ScDocument& rDoc, const ScAddress& rTopPos, ScFormulaCellGroupRef& xGroup, ScTokenArray& rCode) = 0; virtual bool interpret(ScDocument& rDoc, const ScAddress& rTopPos, ScFormulaCellGroupRef& xGroup, ScTokenArray& rCode) = 0;
}; };
...@@ -122,7 +122,7 @@ public: ...@@ -122,7 +122,7 @@ public:
virtual ScMatrixRef inverseMatrix(const ScMatrix& rMat); virtual ScMatrixRef inverseMatrix(const ScMatrix& rMat);
virtual CompiledFormula* createCompiledFormula(ScDocument& rDoc, virtual CompiledFormula* createCompiledFormula(ScDocument& rDoc,
const ScAddress& rTopPos, const ScAddress& rTopPos,
ScFormulaCellGroupRef& xGroup, ScFormulaCellGroup& rGroup,
ScTokenArray& rCode) SAL_OVERRIDE; ScTokenArray& rCode) SAL_OVERRIDE;
virtual bool interpret(ScDocument& rDoc, const ScAddress& rTopPos, ScFormulaCellGroupRef& xGroup, ScTokenArray& rCode) SAL_OVERRIDE; virtual bool interpret(ScDocument& rDoc, const ScAddress& rTopPos, ScFormulaCellGroupRef& xGroup, ScTokenArray& rCode) SAL_OVERRIDE;
}; };
......
...@@ -54,6 +54,8 @@ ...@@ -54,6 +54,8 @@
#include <boost/scoped_ptr.hpp> #include <boost/scoped_ptr.hpp>
#define ENABLE_THREADED_OPENCL_KERNEL_COMPILATION 1
using namespace formula; using namespace formula;
#ifdef USE_MEMPOOL #ifdef USE_MEMPOOL
...@@ -482,7 +484,16 @@ void ScFormulaCellGroup::compileCode( ...@@ -482,7 +484,16 @@ void ScFormulaCellGroup::compileCode(
} }
} }
void ScFormulaCellGroup::compileOpenCLKernel()
{
if (meCalcState == sc::GroupCalcDisabled)
return;
mpCompiledFormula = sc::FormulaGroupInterpreter::getStatic()->createCompiledFormula(
*mpTopCell->GetDocument(), mpTopCell->aPos, *this, *mpCode);
meKernelState = sc::OpenCLKernelBinaryCreated;
}
ScFormulaCell::ScFormulaCell( ScDocument* pDoc, const ScAddress& rPos ) : ScFormulaCell::ScFormulaCell( ScDocument* pDoc, const ScAddress& rPos ) :
eTempGrammar(formula::FormulaGrammar::GRAM_DEFAULT), eTempGrammar(formula::FormulaGrammar::GRAM_DEFAULT),
...@@ -3492,8 +3503,12 @@ ScFormulaCellGroupRef ScFormulaCell::CreateCellGroup( SCROW nLen, bool bInvarian ...@@ -3492,8 +3503,12 @@ ScFormulaCellGroupRef ScFormulaCell::CreateCellGroup( SCROW nLen, bool bInvarian
mxGroup->mbInvariant = bInvariant; mxGroup->mbInvariant = bInvariant;
mxGroup->mnLength = nLen; mxGroup->mnLength = nLen;
mxGroup->mpCode = pCode; // Move this to the shared location. mxGroup->mpCode = pCode; // Move this to the shared location.
#if ENABLE_THREADED_OPENCL_KERNEL_COMPILATION
if (mxGroup->sxCompilationThread.is()) if (mxGroup->sxCompilationThread.is())
mxGroup->scheduleCompilation(); mxGroup->scheduleCompilation();
#else
mxGroup->compileOpenCLKernel();
#endif
return mxGroup; return mxGroup;
} }
......
...@@ -3342,7 +3342,7 @@ public: ...@@ -3342,7 +3342,7 @@ public:
virtual ScMatrixRef inverseMatrix( const ScMatrix& rMat ) SAL_OVERRIDE; virtual ScMatrixRef inverseMatrix( const ScMatrix& rMat ) SAL_OVERRIDE;
virtual CompiledFormula* createCompiledFormula(ScDocument& rDoc, virtual CompiledFormula* createCompiledFormula(ScDocument& rDoc,
const ScAddress& rTopPos, const ScAddress& rTopPos,
ScFormulaCellGroupRef& xGroup, ScFormulaCellGroup& rGroup,
ScTokenArray& rCode) SAL_OVERRIDE; ScTokenArray& rCode) SAL_OVERRIDE;
virtual bool interpret( ScDocument& rDoc, const ScAddress& rTopPos, virtual bool interpret( ScDocument& rDoc, const ScAddress& rTopPos,
ScFormulaCellGroupRef& xGroup, ScTokenArray& rCode ) SAL_OVERRIDE; ScFormulaCellGroupRef& xGroup, ScTokenArray& rCode ) SAL_OVERRIDE;
...@@ -3427,15 +3427,15 @@ DynamicKernel* DynamicKernel::create(ScDocument& /* rDoc */, ...@@ -3427,15 +3427,15 @@ DynamicKernel* DynamicKernel::create(ScDocument& /* rDoc */,
CompiledFormula* FormulaGroupInterpreterOpenCL::createCompiledFormula(ScDocument& rDoc, CompiledFormula* FormulaGroupInterpreterOpenCL::createCompiledFormula(ScDocument& rDoc,
const ScAddress& rTopPos, const ScAddress& rTopPos,
ScFormulaCellGroupRef& xGroup, ScFormulaCellGroup& rGroup,
ScTokenArray& rCode) ScTokenArray& rCode)
{ {
ScTokenArray aConvertedCode; ScTokenArray aConvertedCode;
ScGroupTokenConverter aConverter(aConvertedCode, rDoc, *xGroup->mpTopCell, rTopPos); ScGroupTokenConverter aConverter(aConvertedCode, rDoc, *rGroup.mpTopCell, rTopPos);
if (!aConverter.convert(rCode) || aConvertedCode.GetLen() == 0) if (!aConverter.convert(rCode) || aConvertedCode.GetLen() == 0)
return NULL; return NULL;
SymbolTable::nR = xGroup->mnLength; SymbolTable::nR = rGroup.mnLength;
return DynamicKernel::create(rDoc, rTopPos, aConvertedCode); return DynamicKernel::create(rDoc, rTopPos, aConvertedCode);
} }
...@@ -3460,7 +3460,7 @@ bool FormulaGroupInterpreterOpenCL::interpret( ScDocument& rDoc, ...@@ -3460,7 +3460,7 @@ bool FormulaGroupInterpreterOpenCL::interpret( ScDocument& rDoc,
else else
{ {
assert(xGroup->meCalcState == sc::GroupCalcRunning); assert(xGroup->meCalcState == sc::GroupCalcRunning);
pKernel = static_cast<DynamicKernel*>(createCompiledFormula(rDoc, rTopPos, xGroup, rCode)); pKernel = static_cast<DynamicKernel*>(createCompiledFormula(rDoc, rTopPos, *xGroup, rCode));
} }
if (!pKernel) if (!pKernel)
......
...@@ -49,15 +49,7 @@ void CLBuildKernelThread::execute() ...@@ -49,15 +49,7 @@ void CLBuildKernelThread::execute()
{ {
case CLBuildKernelWorkItem::COMPILE: case CLBuildKernelWorkItem::COMPILE:
SAL_INFO("sc.opencl.thread", "told to compile group " << aWorkItem.mxGroup << " (state " << aWorkItem.mxGroup->meCalcState << ") to binary"); SAL_INFO("sc.opencl.thread", "told to compile group " << aWorkItem.mxGroup << " (state " << aWorkItem.mxGroup->meCalcState << ") to binary");
if (aWorkItem.mxGroup->meCalcState == sc::GroupCalcDisabled) aWorkItem.mxGroup->compileOpenCLKernel();
break;
assert(aWorkItem.mxGroup->meKernelState == sc::OpenCLKernelCompilationScheduled);
aWorkItem.mxGroup->mpCompiledFormula =
sc::FormulaGroupInterpreter::getStatic()->createCompiledFormula(*aWorkItem.mxGroup->mpTopCell->GetDocument(),
aWorkItem.mxGroup->mpTopCell->aPos,
aWorkItem.mxGroup,
*aWorkItem.mxGroup->mpCode);
aWorkItem.mxGroup->meKernelState = sc::OpenCLKernelBinaryCreated;
SAL_INFO("sc.opencl.thread", "group " << aWorkItem.mxGroup << " compilation done"); SAL_INFO("sc.opencl.thread", "group " << aWorkItem.mxGroup << " compilation done");
maCompilationDoneCondition.set(); maCompilationDoneCondition.set();
break; break;
......
...@@ -294,7 +294,7 @@ ScMatrixRef FormulaGroupInterpreterSoftware::inverseMatrix(const ScMatrix& /*rMa ...@@ -294,7 +294,7 @@ ScMatrixRef FormulaGroupInterpreterSoftware::inverseMatrix(const ScMatrix& /*rMa
CompiledFormula* FormulaGroupInterpreterSoftware::createCompiledFormula(ScDocument& /* rDoc */, CompiledFormula* FormulaGroupInterpreterSoftware::createCompiledFormula(ScDocument& /* rDoc */,
const ScAddress& /* rTopPos */, const ScAddress& /* rTopPos */,
ScFormulaCellGroupRef& /* xGroup */, ScFormulaCellGroup& /* rGroup */,
ScTokenArray& /* rCode */) ScTokenArray& /* rCode */)
{ {
return NULL; return NULL;
...@@ -502,7 +502,7 @@ public: ...@@ -502,7 +502,7 @@ public:
FormulaGroupInterpreterOpenCLMissing() : FormulaGroupInterpreter() {} FormulaGroupInterpreterOpenCLMissing() : FormulaGroupInterpreter() {}
virtual ~FormulaGroupInterpreterOpenCLMissing() {} virtual ~FormulaGroupInterpreterOpenCLMissing() {}
virtual ScMatrixRef inverseMatrix(const ScMatrix&) { return ScMatrixRef(); } virtual ScMatrixRef inverseMatrix(const ScMatrix&) { return ScMatrixRef(); }
virtual CompiledFormula* createCompiledFormula(ScDocument&, const ScAddress&, ScFormulaCellGroupRef&, ScTokenArray&) SAL_OVERRIDE { return NULL; } virtual CompiledFormula* createCompiledFormula(ScDocument&, const ScAddress&, ScFormulaCellGroup&, ScTokenArray&) SAL_OVERRIDE { return NULL; }
virtual bool interpret(ScDocument&, const ScAddress&, ScFormulaCellGroupRef&, ScTokenArray&) { return false; } virtual bool interpret(ScDocument&, const ScAddress&, ScFormulaCellGroupRef&, ScTokenArray&) { return false; }
}; };
......
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