sc/inc/formulacell.hxx | 15 ++++++++++----- sc/inc/types.hxx | 1 + sc/source/core/data/formulacell.cxx | 3 +++ sc/source/core/opencl/formulagroupcl.cxx | 18 ++++++++++++++++-- sc/source/core/tool/clkernelthread.cxx | 9 +++++++++ 5 files changed, 39 insertions(+), 7 deletions(-)
New commits: commit bec94973e236a464dbeef853ba157aead8637799 Author: Tor Lillqvist <t...@collabora.com> Date: Wed Nov 13 18:06:32 2013 +0200 WIP: Background ahead-of-time OpenCL compilation Change-Id: I6e9906fb68a22eb0adab753726ec0d62dd05fe9b diff --git a/sc/inc/formulacell.hxx b/sc/inc/formulacell.hxx index 68648fc..656eebb 100644 --- a/sc/inc/formulacell.hxx +++ b/sc/inc/formulacell.hxx @@ -20,15 +20,19 @@ #ifndef SC_FORMULACELL_HXX #define SC_FORMULACELL_HXX -#include "formularesult.hxx" +#include <set> + +#include <boost/noncopyable.hpp> -#include "formula/tokenarray.hxx" +#include <formula/tokenarray.hxx> +#include <osl/conditn.hxx> +#include <osl/mutex.hxx> #include <rtl/ref.hxx> -#include "svl/listener.hxx" +#include <svl/listener.hxx> + #include "types.hxx" -#include <set> -#include <boost/noncopyable.hpp> +#include "formularesult.hxx" namespace sc { @@ -54,6 +58,7 @@ struct SC_DLLPUBLIC ScFormulaCellGroup : boost::noncopyable ScTokenArray* mpCode; osl::Mutex maMutex; + osl::Condition maCompilationDone; sc::CompiledFormula* mpCompiledFormula; ScFormulaCell *mpTopCell; SCROW mnLength; // How many of these do we have ? diff --git a/sc/inc/types.hxx b/sc/inc/types.hxx index 1704341..fc0e0e8 100644 --- a/sc/inc/types.hxx +++ b/sc/inc/types.hxx @@ -59,6 +59,7 @@ const sal_uInt16 MatrixEdgeOpen = 32; enum GroupCalcState { GroupCalcEnabled, + GroupCalcOpenCLKernelCompilationScheduled, GroupCalcOpenCLKernelBinaryCreated, GroupCalcRunning, GroupCalcDisabled diff --git a/sc/source/core/data/formulacell.cxx b/sc/source/core/data/formulacell.cxx index f1ed90b..724922b 100644 --- a/sc/source/core/data/formulacell.cxx +++ b/sc/source/core/data/formulacell.cxx @@ -445,9 +445,12 @@ ScFormulaCellGroup::~ScFormulaCellGroup() void ScFormulaCellGroup::scheduleCompilation() { + osl::ResettableMutexGuard aGuard(maMutex); + meCalcState = sc::GroupCalcOpenCLKernelCompilationScheduled; sc::CLBuildKernelWorkItem aWorkItem; aWorkItem.meWhatToDo = sc::CLBuildKernelWorkItem::COMPILE; aWorkItem.mxGroup = this; + aGuard.clear(); mxCLKernelThread->push(aWorkItem); } diff --git a/sc/source/core/opencl/formulagroupcl.cxx b/sc/source/core/opencl/formulagroupcl.cxx index 895bdc4..a1b902e 100644 --- a/sc/source/core/opencl/formulagroupcl.cxx +++ b/sc/source/core/opencl/formulagroupcl.cxx @@ -1540,8 +1540,22 @@ bool FormulaGroupInterpreterOpenCL::interpret( ScDocument& rDoc, const ScAddress& rTopPos, const ScFormulaCellGroupRef& xGroup, ScTokenArray& rCode ) { - // printf("Vector width = %d\n", xGroup->mnLength); - DynamicKernel *pKernel = DynamicKernel::create(rDoc, rTopPos, rCode); + DynamicKernel *pKernel; + + osl::ResettableMutexGuard aGuard(xGroup->maMutex); + if (xGroup->meCalcState == sc::GroupCalcOpenCLKernelCompilationScheduled) + { + aGuard.clear(); + xGroup->maCompilationDone.wait(); + xGroup->maCompilationDone.reset(); + pKernel = static_cast<DynamicKernel*>(xGroup->mpCompiledFormula); + } + else + { + aGuard.clear(); + pKernel = DynamicKernel::create(rDoc, rTopPos, rCode); + } + if (!pKernel) return false; diff --git a/sc/source/core/tool/clkernelthread.cxx b/sc/source/core/tool/clkernelthread.cxx index b89312b..7404a80 100644 --- a/sc/source/core/tool/clkernelthread.cxx +++ b/sc/source/core/tool/clkernelthread.cxx @@ -9,6 +9,8 @@ #include <sal/log.hxx> +#include "formulagroupinterpreter.hxx" + #include "clkernelthread.hxx" using namespace std; @@ -46,6 +48,13 @@ void CLBuildKernelThread::execute() { case CLBuildKernelWorkItem::COMPILE: SAL_INFO("sc.opencl.thread", "told to compile group " << aWorkItem.mxGroup << " to binary"); + assert(aWorkItem.mxGroup->meCalcState == sc::GroupCalcOpenCLKernelCompilationScheduled); + aWorkItem.mxGroup->mpCompiledFormula = + sc::FormulaGroupInterpreter::getStatic()->createCompiledFormula(*aWorkItem.mxGroup->mpTopCell->GetDocument(), + aWorkItem.mxGroup->mpTopCell->aPos, + *aWorkItem.mxGroup->mpCode); + aWorkItem.mxGroup->meCalcState = sc::GroupCalcOpenCLKernelBinaryCreated; + aWorkItem.mxGroup->maCompilationDone.set(); break; case CLBuildKernelWorkItem::FINISH: SAL_INFO("sc.opencl.thread", "told to finish"); _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits