sc/source/core/opencl/formulagroupcl.cxx |   56 +++++++++++++++++++------------
 1 file changed, 36 insertions(+), 20 deletions(-)

New commits:
commit 2dcee42f4e8e8ca8821e37b5ec9d24aeb4b736c1
Author: I-Jui (Ray) Sung <r...@multicorewareinc.com>
Date:   Fri Nov 29 01:53:48 2013 -0600

    GPU Calc: cache the very last compiled program in memory
    
    Change-Id: Ib805c31f0c1b57708c38c02a9bdc492af5c7a439

diff --git a/sc/source/core/opencl/formulagroupcl.cxx 
b/sc/source/core/opencl/formulagroupcl.cxx
index b43817b..140bfd5 100644
--- a/sc/source/core/opencl/formulagroupcl.cxx
+++ b/sc/source/core/opencl/formulagroupcl.cxx
@@ -2652,9 +2652,7 @@ DynamicKernel::~DynamicKernel()
     if (mpKernel) {
         clReleaseKernel(mpKernel);
     }
-    if (mpProgram) {
-        clReleaseProgram(mpProgram);
-    }
+    // mpProgram is not going to be released here -- it's cached.
     if (mpCode)
         delete mpCode;
 }
@@ -2668,23 +2666,41 @@ void DynamicKernel::CreateKernel(void)
     KernelEnv kEnv;
     OpenclDevice::setKernelEnv(&kEnv);
     const char *src = mFullProgramSrc.c_str();
-    if (OpenclDevice::buildProgramFromBinary("",
-        &OpenclDevice::gpuEnv,
-        (mKernelSignature+GetMD5()).c_str(), 0)) {
-        mpProgram = OpenclDevice::gpuEnv.mpArryPrograms[0];
-        OpenclDevice::gpuEnv.mpArryPrograms[0] = NULL;
-    } else {
-        mpProgram = clCreateProgramWithSource(kEnv.mpkContext, 1,
-                &src, NULL, &err);
-        if (err != CL_SUCCESS)
-            throw OpenCLError(err);
-        err = clBuildProgram(mpProgram, 1,
-                OpenclDevice::gpuEnv.mpArryDevsID, "", NULL, NULL);
-        if (err != CL_SUCCESS)
-            throw OpenCLError(err);
-        // Generate binary out of compiled kernel.
-        OpenclDevice::generatBinFromKernelSource(mpProgram,
-                (mKernelSignature+GetMD5()).c_str());
+    static std::string lastKernelHash = "";
+    static cl_program lastProgram = NULL;
+    std::string KernelHash = mKernelSignature+GetMD5();
+    if (lastKernelHash == KernelHash && lastProgram)
+    {
+        std::cerr<<"cl_program cache hit: "<< KernelHash << "\n";
+        mpProgram = lastProgram;
+    }
+    else
+    {   // doesn't match the last compiled formula.
+
+        if (lastProgram) {
+            std::cerr<<"Freeing last program: "<< GetMD5() << "\n";
+            clReleaseProgram(lastProgram);
+            lastProgram = NULL;
+        }
+        if (OpenclDevice::buildProgramFromBinary("",
+                    &OpenclDevice::gpuEnv, KernelHash.c_str(), 0)) {
+            mpProgram = OpenclDevice::gpuEnv.mpArryPrograms[0];
+            OpenclDevice::gpuEnv.mpArryPrograms[0] = NULL;
+        } else {
+            mpProgram = clCreateProgramWithSource(kEnv.mpkContext, 1,
+                    &src, NULL, &err);
+            if (err != CL_SUCCESS)
+                throw OpenCLError(err);
+            err = clBuildProgram(mpProgram, 1,
+                    OpenclDevice::gpuEnv.mpArryDevsID, "", NULL, NULL);
+            if (err != CL_SUCCESS)
+                throw OpenCLError(err);
+            // Generate binary out of compiled kernel.
+            OpenclDevice::generatBinFromKernelSource(mpProgram,
+                    (mKernelSignature+GetMD5()).c_str());
+        }
+        lastKernelHash = KernelHash;
+        lastProgram = mpProgram;
     }
     mpKernel = clCreateKernel(mpProgram, kname.c_str(), &err);
     if (err != CL_SUCCESS)
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to