[Libreoffice-commits] core.git: Branch 'private/tml/opencl-background-compilation' - sc/source

Tor Lillqvist tml at collabora.com
Mon Nov 18 08:01:55 PST 2013


 sc/source/core/data/formulacell.cxx      |    2 +-
 sc/source/core/inc/dynamickernel.hxx     |    5 ++++-
 sc/source/core/opencl/formulagroupcl.cxx |   17 ++++++++++-------
 3 files changed, 15 insertions(+), 9 deletions(-)

New commits:
commit aa0389ab7ee0fc2070a595b9d2242e8f1f873ea3
Author: Tor Lillqvist <tml at collabora.com>
Date:   Mon Nov 18 17:59:30 2013 +0200

    Fix some life-cycle issues for backgroup OpenCL kernel compilation
    
    Now it no longer asserts or crashes in light testing, but it doesn't
    properly recalculate either.
    
    Change-Id: I7dc117341eff5ac1b21d7400122cc6e04ae2baf7

diff --git a/sc/source/core/data/formulacell.cxx b/sc/source/core/data/formulacell.cxx
index 9f6fa00..cf4516d 100644
--- a/sc/source/core/data/formulacell.cxx
+++ b/sc/source/core/data/formulacell.cxx
@@ -1771,7 +1771,7 @@ void ScFormulaCell::SetDirty( bool bDirtyFlag )
 void ScFormulaCell::SetDirtyVar()
 {
     bDirty = true;
-    if (mxGroup)
+    if (mxGroup && mxGroup->meCalcState == sc::GroupCalcRunning)
         mxGroup->meCalcState = sc::GroupCalcEnabled;
 
     // mark the sheet of this cell to be calculated
diff --git a/sc/source/core/inc/dynamickernel.hxx b/sc/source/core/inc/dynamickernel.hxx
index 5d5780f..e4a42aa 100644
--- a/sc/source/core/inc/dynamickernel.hxx
+++ b/sc/source/core/inc/dynamickernel.hxx
@@ -63,7 +63,7 @@ class DynamicKernel : public CompiledFormula
 {
 private:
     DynamicKernel(FormulaTreeNodeRef r):mpRoot(r),
-        mpProgram(NULL), mpKernel(NULL), mpResClmem(NULL) {}
+        mpProgram(NULL), mpKernel(NULL), mpResClmem(NULL), mpCode(NULL) {}
 
 public:
     static DynamicKernel *create(ScDocument& rDoc,
@@ -88,6 +88,8 @@ public:
 
     cl_mem GetResultBuffer(void) const { return mpResClmem; }
 
+    void SetPCode(ScTokenArray *pCode) { mpCode = pCode; }
+
 private:
     void TraverseAST(FormulaTreeNodeRef);
     FormulaTreeNodeRef mpRoot;
@@ -99,6 +101,7 @@ private:
     cl_mem mpResClmem; // Results
     std::set<std::string> inlineDecl;
     std::set<std::string> inlineFun;
+    ScTokenArray *mpCode;
 };
 
 }
diff --git a/sc/source/core/opencl/formulagroupcl.cxx b/sc/source/core/opencl/formulagroupcl.cxx
index 3465dd9..a66e4e1 100644
--- a/sc/source/core/opencl/formulagroupcl.cxx
+++ b/sc/source/core/opencl/formulagroupcl.cxx
@@ -50,7 +50,6 @@ namespace sc { namespace opencl {
 size_t DynamicKernelArgument::Marshal(cl_kernel k, int argno, int)
 {
     FormulaToken *ref = mFormulaTree->GetFormulaToken();
-    assert(mpClmem == NULL);
     double *pHostBuffer = NULL;
     size_t szHostBuffer = 0;
     if (ref->GetType() == formula::svSingleVectorRef) {
@@ -131,7 +130,6 @@ public:
     virtual size_t Marshal(cl_kernel k, int argno, int)
     {
         FormulaToken *ref = mFormulaTree->GetFormulaToken();
-        assert(mpClmem == NULL);
         cl_uint hashCode = 0;
         if (ref->GetType() == formula::svString)
         {
@@ -221,7 +219,6 @@ public:
 size_t DynamicKernelStringArgument::Marshal(cl_kernel k, int argno, int)
 {
     FormulaToken *ref = mFormulaTree->GetFormulaToken();
-    assert(mpClmem == NULL);
     // Obtain cl context
     KernelEnv kEnv;
     OpenclDevice::setKernelEnv(&kEnv);
@@ -1382,6 +1379,8 @@ DynamicKernel::~DynamicKernel()
         std::cerr<<"Freeing kernel "<< GetMD5() << " program\n";
         clReleaseProgram(mpProgram);
     }
+    if (mpCode)
+        delete mpCode;
 }
 /// Build code
 void DynamicKernel::CreateKernel(void)
@@ -1537,14 +1536,16 @@ CompiledFormula* FormulaGroupInterpreterOpenCL::createCompiledFormula(ScDocument
                                                                       ScFormulaCellGroupRef& xGroup,
                                                                       ScTokenArray& rCode)
 {
-    ScTokenArray aCode;
-    ScGroupTokenConverter aConverter(aCode, rDoc, *xGroup->mpTopCell, rTopPos);
+    ScTokenArray *pCode = new ScTokenArray();
+    ScGroupTokenConverter aConverter(*pCode, rDoc, *xGroup->mpTopCell, rTopPos);
     if (!aConverter.convert(rCode))
     {
         return NULL;
     }
 
-    return DynamicKernel::create(rDoc, rTopPos, aCode);
+    DynamicKernel *result = DynamicKernel::create(rDoc, rTopPos, *pCode);
+    result->SetPCode(pCode);
+    return result;
 }
 
 bool FormulaGroupInterpreterOpenCL::interpret( ScDocument& rDoc,
@@ -1572,6 +1573,7 @@ bool FormulaGroupInterpreterOpenCL::interpret( ScDocument& rDoc,
     }
     else
     {
+        assert(xGroup->meCalcState == sc::GroupCalcRunning);
         aGuard.clear();
         pKernel = static_cast<DynamicKernel*>(createCompiledFormula(rDoc, rTopPos, xGroup, rCode));
     }
@@ -1599,7 +1601,8 @@ bool FormulaGroupInterpreterOpenCL::interpret( ScDocument& rDoc,
         err = clEnqueueUnmapMemObject(kEnv.mpkCmdQueue, res, resbuf, 0, NULL, NULL);
         if (err != CL_SUCCESS)
             throw OpenCLError(err);
-        delete pKernel;
+        if (xGroup->meCalcState == sc::GroupCalcRunning)
+            delete pKernel;
         return true;
     }
     catch (const UnhandledToken &ut) {


More information about the Libreoffice-commits mailing list