@@ -200,9 +200,9 @@ class OpenClContext : public ComputeContext {
200200 void runHealthChecks ();
201201 std::string runHealthCheckProgram (const std::string& source, const std::string& kernelName);
202202
203- static void releaseMem (cl_mem& m);
204- static void releaseKernel (cl_kernel& k);
205- static void releaseProgram (cl_program& p);
203+ static void releaseMem (cl_mem& m, const std::string& desc );
204+ static void releaseKernel (cl_kernel& k, const std::string& desc );
205+ static void releaseProgram (cl_program& p, const std::string& desc );
206206
207207 enum class ComputeState { idle, createInput, createVariates, calc };
208208
@@ -324,20 +324,20 @@ OpenClContext::~OpenClContext() {
324324 cl_int err;
325325
326326 if (variatesPoolSize_ > 0 ) {
327- releaseMem (variatesPool_);
328- releaseMem (variatesMtStateBuffer_);
329- releaseKernel (variatesKernelSeedInit_);
330- releaseKernel (variatesKernelTwist_);
331- releaseKernel (variatesKernelGenerate_);
332- releaseProgram (variatesProgram_);
327+ releaseMem (variatesPool_, " variates pool " );
328+ releaseMem (variatesMtStateBuffer_, " variates state buffer " );
329+ releaseKernel (variatesKernelSeedInit_, " variates seed init " );
330+ releaseKernel (variatesKernelTwist_, " variates twist " );
331+ releaseKernel (variatesKernelGenerate_, " variates generate " );
332+ releaseProgram (variatesProgram_, " variates " );
333333 }
334334
335335 for (auto & k : kernel_) {
336- releaseKernel (k);
336+ releaseKernel (k, " ore kernel " );
337337 }
338338
339339 for (auto & p : program_) {
340- releaseProgram (p);
340+ releaseProgram (p, " ore program " );
341341 }
342342
343343 if (err = clReleaseCommandQueue (queue_); err != CL_SUCCESS) {
@@ -350,24 +350,27 @@ OpenClContext::~OpenClContext() {
350350 }
351351}
352352
353- void OpenClContext::releaseMem (cl_mem& m) {
353+ void OpenClContext::releaseMem (cl_mem& m, const std::string& description ) {
354354 cl_int err;
355355 if (err = clReleaseMemObject (m); err != CL_SUCCESS) {
356- std::cerr << " OpenClContext: error during clReleaseMemObject: " + errorText (err) << std::endl;
356+ std::cerr << " OpenClContext: error during clReleaseMemObject '" << description << " ': " + errorText (err)
357+ << std::endl;
357358 }
358359}
359360
360- void OpenClContext::releaseKernel (cl_kernel& k) {
361+ void OpenClContext::releaseKernel (cl_kernel& k, const std::string& description ) {
361362 cl_int err;
362363 if (err = clReleaseKernel (k); err != CL_SUCCESS) {
363- std::cerr << " OpenClContext: error during clReleaseKernel: " + errorText (err) << std::endl;
364+ std::cerr << " OpenClContext: error during clReleaseKernel'" << description << " ': " + errorText (err)
365+ << std::endl;
364366 }
365367}
366368
367- void OpenClContext::releaseProgram (cl_program& p) {
369+ void OpenClContext::releaseProgram (cl_program& p, const std::string& description ) {
368370 cl_int err;
369371 if (err = clReleaseProgram (p); err != CL_SUCCESS) {
370- std::cerr << " OpenClContext: error during clReleaseProgram: " + errorText (err) << std::endl;
372+ std::cerr << " OpenClContext: error during clReleaseProgram'" << description << " ': " + errorText (err)
373+ << std::endl;
371374 }
372375}
373376
@@ -379,11 +382,11 @@ std::string OpenClContext::runHealthCheckProgram(const std::string& source, cons
379382 std::vector<cl_mem> m;
380383 ~CleanUp () {
381384 for (auto & pgm : p)
382- OpenClContext::releaseProgram (pgm);
385+ OpenClContext::releaseProgram (pgm, " health check " );
383386 for (auto & krn : k)
384- OpenClContext::releaseKernel (krn);
387+ OpenClContext::releaseKernel (krn, " health check " );
385388 for (auto & mem : m)
386- OpenClContext::releaseMem (mem);
389+ OpenClContext::releaseMem (mem, " health check " );
387390 }
388391 } cleanup;
389392
@@ -525,8 +528,8 @@ std::pair<std::size_t, bool> OpenClContext::initiateCalculation(const std::size_
525528 if (version != version_[id - 1 ]) {
526529 hasKernel_[id - 1 ] = false ;
527530 version_[id - 1 ] = version;
528- releaseKernel (kernel_[id - 1 ]);
529- releaseProgram (program_[id - 1 ]);
531+ releaseKernel (kernel_[id - 1 ], " kernel id " + std::to_string (id) );
532+ releaseProgram (program_[id - 1 ], " program id " + std::to_string (id) );
530533 newCalc = true ;
531534 }
532535
@@ -777,11 +780,16 @@ void OpenClContext::updateVariatesPool() {
777780 cl_int err;
778781
779782 cl_mem oldBuffer = variatesPool_;
783+
780784 struct OldBufferReleaser {
781- OldBufferReleaser (cl_mem b) : b(b) {}
782- ~OldBufferReleaser () { OpenClContext::releaseMem (b); }
785+ OldBufferReleaser (cl_mem b, bool active) : b(b), active(active) {}
786+ ~OldBufferReleaser () {
787+ if (active)
788+ OpenClContext::releaseMem (b, " expired variates buffer" );
789+ }
783790 cl_mem b;
784- } oldBufferReleaser (oldBuffer);
791+ bool active;
792+ } oldBufferReleaser (oldBuffer, variatesPoolSize_ > 0 );
785793
786794 variatesPool_ = clCreateBuffer (context_, CL_MEM_READ_WRITE, fpSize * alignedSize, NULL , &err);
787795 QL_REQUIRE (err == CL_SUCCESS, " OpenClContext::updateVariatesPool(): error creating variates buffer with size "
0 commit comments