Skip to content

Commit 2cafc97

Browse files
pcaspersjenkins
authored andcommitted
QPR-12455 fix expired variates buffer mem release, better error messages
1 parent 350554d commit 2cafc97

1 file changed

Lines changed: 33 additions & 25 deletions

File tree

QuantExt/qle/math/openclenvironment.cpp

Lines changed: 33 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)