diff options
author | haochen <haochen@multicorewareinc.com> | 2013-11-30 10:51:49 +0800 |
---|---|---|
committer | Michael Meeks <michael.meeks@collabora.com> | 2013-12-10 09:46:43 +0000 |
commit | 445299be76934c6c593793aae2d7630f8a42562b (patch) | |
tree | 5439e5da8d2821553ff12bd77796c4c8ab7f634d /sc | |
parent | e446b4a598acf0e76eebf99d33d6691741c4cbba (diff) |
GPU Calc: cache more once compiled program in memory
Change-Id: Iab34567806e069d819c86b52f93d88355272416f
Diffstat (limited to 'sc')
-rw-r--r-- | sc/source/core/opencl/formulagroupcl.cxx | 28 |
1 files changed, 18 insertions, 10 deletions
diff --git a/sc/source/core/opencl/formulagroupcl.cxx b/sc/source/core/opencl/formulagroupcl.cxx index 1c79f3653a8c..b73b32a2db89 100644 --- a/sc/source/core/opencl/formulagroupcl.cxx +++ b/sc/source/core/opencl/formulagroupcl.cxx @@ -2675,21 +2675,27 @@ void DynamicKernel::CreateKernel(void) KernelEnv kEnv; OpenclDevice::setKernelEnv(&kEnv); const char *src = mFullProgramSrc.c_str(); - static std::string lastKernelHash = ""; - static cl_program lastProgram = NULL; + static std::string lastOneKernelHash = ""; + static std::string lastSecondKernelHash = ""; + static cl_program lastOneProgram = NULL; + static cl_program lastSecondProgram = NULL; std::string KernelHash = mKernelSignature+GetMD5(); - if (lastKernelHash == KernelHash && lastProgram) + if (lastOneKernelHash == KernelHash && lastOneProgram) { std::cerr<<"cl_program cache hit: "<< KernelHash << "\n"; - mpProgram = lastProgram; + mpProgram = lastOneProgram; + } + else if(lastSecondKernelHash == KernelHash && lastSecondProgram) + { + std::cerr<<"cl_program cache hit: "<< KernelHash << "\n"; + mpProgram = lastSecondProgram; } else { // doesn't match the last compiled formula. - if (lastProgram) { - std::cerr<<"Freeing last program: "<< GetMD5() << "\n"; - clReleaseProgram(lastProgram); - lastProgram = NULL; + if (lastSecondProgram) { + std::cerr<<"Freeing lastsecond program: "<< GetMD5() << "\n"; + clReleaseProgram(lastSecondProgram); } if (OpenclDevice::buildProgramFromBinary("", &OpenclDevice::gpuEnv, KernelHash.c_str(), 0)) { @@ -2754,8 +2760,10 @@ void DynamicKernel::CreateKernel(void) OpenclDevice::generatBinFromKernelSource(mpProgram, (mKernelSignature+GetMD5()).c_str()); } - lastKernelHash = KernelHash; - lastProgram = mpProgram; + lastSecondKernelHash = lastOneKernelHash; + lastSecondProgram = lastOneProgram; + lastOneKernelHash = KernelHash; + lastOneProgram = mpProgram; } mpKernel = clCreateKernel(mpProgram, kname.c_str(), &err); if (err != CL_SUCCESS) |