Kaydet (Commit) 445299be authored tarafından haochen's avatar haochen Kaydeden (comit) Michael Meeks

GPU Calc: cache more once compiled program in memory

Change-Id: Iab34567806e069d819c86b52f93d88355272416f
üst e446b4a5
...@@ -2675,21 +2675,27 @@ void DynamicKernel::CreateKernel(void) ...@@ -2675,21 +2675,27 @@ void DynamicKernel::CreateKernel(void)
KernelEnv kEnv; KernelEnv kEnv;
OpenclDevice::setKernelEnv(&kEnv); OpenclDevice::setKernelEnv(&kEnv);
const char *src = mFullProgramSrc.c_str(); const char *src = mFullProgramSrc.c_str();
static std::string lastKernelHash = ""; static std::string lastOneKernelHash = "";
static cl_program lastProgram = NULL; static std::string lastSecondKernelHash = "";
static cl_program lastOneProgram = NULL;
static cl_program lastSecondProgram = NULL;
std::string KernelHash = mKernelSignature+GetMD5(); std::string KernelHash = mKernelSignature+GetMD5();
if (lastKernelHash == KernelHash && lastProgram) if (lastOneKernelHash == KernelHash && lastOneProgram)
{ {
std::cerr<<"cl_program cache hit: "<< KernelHash << "\n"; 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 else
{ // doesn't match the last compiled formula. { // doesn't match the last compiled formula.
if (lastProgram) { if (lastSecondProgram) {
std::cerr<<"Freeing last program: "<< GetMD5() << "\n"; std::cerr<<"Freeing lastsecond program: "<< GetMD5() << "\n";
clReleaseProgram(lastProgram); clReleaseProgram(lastSecondProgram);
lastProgram = NULL;
} }
if (OpenclDevice::buildProgramFromBinary("", if (OpenclDevice::buildProgramFromBinary("",
&OpenclDevice::gpuEnv, KernelHash.c_str(), 0)) { &OpenclDevice::gpuEnv, KernelHash.c_str(), 0)) {
...@@ -2754,8 +2760,10 @@ void DynamicKernel::CreateKernel(void) ...@@ -2754,8 +2760,10 @@ void DynamicKernel::CreateKernel(void)
OpenclDevice::generatBinFromKernelSource(mpProgram, OpenclDevice::generatBinFromKernelSource(mpProgram,
(mKernelSignature+GetMD5()).c_str()); (mKernelSignature+GetMD5()).c_str());
} }
lastKernelHash = KernelHash; lastSecondKernelHash = lastOneKernelHash;
lastProgram = mpProgram; lastSecondProgram = lastOneProgram;
lastOneKernelHash = KernelHash;
lastOneProgram = mpProgram;
} }
mpKernel = clCreateKernel(mpProgram, kname.c_str(), &err); mpKernel = clCreateKernel(mpProgram, kname.c_str(), &err);
if (err != CL_SUCCESS) if (err != CL_SUCCESS)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment