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