diff --git a/src/backend/opencl/runners/OclCnRunner.cpp b/src/backend/opencl/runners/OclCnRunner.cpp index 2fbc5287e..a1f4d5cb2 100644 --- a/src/backend/opencl/runners/OclCnRunner.cpp +++ b/src/backend/opencl/runners/OclCnRunner.cpp @@ -75,6 +75,7 @@ xmrig::OclCnRunner::~OclCnRunner() } if (m_algorithm == Algorithm::CN_R) { + OclLib::release(m_cnr); OclCnR::clear(); } } @@ -130,10 +131,15 @@ void xmrig::OclCnRunner::set(const Job &job, uint8_t *blob) if (m_algorithm == Algorithm::CN_R && m_height != job.height()) { delete m_cn1; - m_height = job.height(); - m_cnr = OclCnR::get(*this, m_height); - m_cn1 = new Cn1Kernel(m_cnr, m_height); + m_height = job.height(); + auto program = OclCnR::get(*this, m_height); + m_cn1 = new Cn1Kernel(program, m_height); m_cn1->setArgs(m_input, m_scratchpads, m_states, m_intensity); + + if (m_cnr != program) { + OclLib::release(m_cnr); + m_cnr = OclLib::retain(program); + } } for (auto kernel : m_branchKernels) { diff --git a/src/backend/opencl/wrappers/OclLib.cpp b/src/backend/opencl/wrappers/OclLib.cpp index 20fb3b5d4..0a6958d48 100644 --- a/src/backend/opencl/wrappers/OclLib.cpp +++ b/src/backend/opencl/wrappers/OclLib.cpp @@ -73,6 +73,7 @@ static const char *kReleaseDevice = "clReleaseDevice"; static const char *kReleaseKernel = "clReleaseKernel"; static const char *kReleaseMemObject = "clReleaseMemObject"; static const char *kReleaseProgram = "clReleaseProgram"; +static const char *kRetainProgram = "clRetainProgram"; static const char *kSetKernelArg = "clSetKernelArg"; static const char *kSetMemObjectDestructorCallback = "clSetMemObjectDestructorCallback"; static const char *kUnloadPlatformCompiler = "clUnloadPlatformCompiler"; @@ -105,6 +106,7 @@ typedef cl_int (CL_API_CALL *releaseDevice_t)(cl_device_id device); typedef cl_int (CL_API_CALL *releaseKernel_t)(cl_kernel); typedef cl_int (CL_API_CALL *releaseMemObject_t)(cl_mem); typedef cl_int (CL_API_CALL *releaseProgram_t)(cl_program); +typedef cl_int (CL_API_CALL *retainProgram_t)(cl_program); typedef cl_int (CL_API_CALL *setKernelArg_t)(cl_kernel, cl_uint, size_t, const void *); typedef cl_int (CL_API_CALL *setMemObjectDestructorCallback_t)(cl_mem, void (CL_CALLBACK *)(cl_mem, void *), void *); typedef cl_int (CL_API_CALL *unloadPlatformCompiler_t)(cl_platform_id); @@ -146,6 +148,7 @@ static releaseDevice_t pReleaseDevice = nu static releaseKernel_t pReleaseKernel = nullptr; static releaseMemObject_t pReleaseMemObject = nullptr; static releaseProgram_t pReleaseProgram = nullptr; +static retainProgram_t pRetainProgram = nullptr; static setKernelArg_t pSetKernelArg = nullptr; static setMemObjectDestructorCallback_t pSetMemObjectDestructorCallback = nullptr; static unloadPlatformCompiler_t pUnloadPlatformCompiler = nullptr; @@ -235,6 +238,7 @@ bool xmrig::OclLib::load() DLSYM(UnloadPlatformCompiler); DLSYM(SetMemObjectDestructorCallback); DLSYM(CreateSubBuffer); + DLSYM(RetainProgram); # if defined(CL_VERSION_2_0) uv_dlsym(&oclLib, kCreateCommandQueueWithProperties, reinterpret_cast(&pCreateCommandQueueWithProperties)); @@ -557,7 +561,7 @@ cl_int xmrig::OclLib::release(cl_program program) noexcept return CL_SUCCESS; } - LOG_REFS("%p %u ~program %s", program, getUint(program, CL_PROGRAM_REFERENCE_COUNT), getString(program, CL_PROGRAM_KERNEL_NAMES).data()); + LOG_REFS("%p %u ~program %s", program, getUint(program, CL_PROGRAM_REFERENCE_COUNT), getString(program, CL_PROGRAM_KERNEL_NAMES).data()); // FIXME const cl_int ret = pReleaseProgram(program); if (ret != CL_SUCCESS) { @@ -696,6 +700,18 @@ cl_program xmrig::OclLib::createProgramWithSource(cl_context context, cl_uint co } +cl_program xmrig::OclLib::retain(cl_program program) noexcept +{ + assert(pRetainProgram != nullptr); + + if (program != nullptr) { + pRetainProgram(program); + } + + return program; +} + + cl_uint xmrig::OclLib::getNumPlatforms() noexcept { cl_uint count = 0; diff --git a/src/backend/opencl/wrappers/OclLib.h b/src/backend/opencl/wrappers/OclLib.h index 893e2a25b..e9e4b8f3d 100644 --- a/src/backend/opencl/wrappers/OclLib.h +++ b/src/backend/opencl/wrappers/OclLib.h @@ -81,6 +81,7 @@ public: static cl_mem createSubBuffer(cl_mem buffer, cl_mem_flags flags, size_t offset, size_t size); static cl_program createProgramWithBinary(cl_context context, cl_uint num_devices, const cl_device_id *device_list, const size_t *lengths, const unsigned char **binaries, cl_int *binary_status, cl_int *errcode_ret) noexcept; static cl_program createProgramWithSource(cl_context context, cl_uint count, const char **strings, const size_t *lengths, cl_int *errcode_ret) noexcept; + static cl_program retain(cl_program program) noexcept; static cl_uint getNumPlatforms() noexcept; static cl_uint getUint(cl_command_queue command_queue, cl_command_queue_info param_name, cl_uint defaultValue = 0) noexcept; static cl_uint getUint(cl_context context, cl_context_info param_name, cl_uint defaultValue = 0) noexcept;