Я обнаружил, что мой проект каждый раз использует больше памяти, так как ресурс OpenCL не может быть освобожден. После того, как часть проекта OpenCL будет полностью запущена, я освобождаю commandQueue, программу и контекст следующим кодом. Но очередь команд не может быть освобождена.
{
checkErr(clReleaseCommandQueue(commandQueue), "clReleaseCommandQueue");
checkErr(clReleaseProgram(program), "clReleaseProgram");
checkErr(clReleaseContext(context), "clReleaseContext");
}
Поэтому я использую clFinish
и clgetCommandQueueInfo
для получения refCount commandQueue.
cl_uint count;
clGetCommandQueueInfo( commandQueue, CL_QUEUE_REFERENCE_COUNT, sizeof(cl_uint), &count, NULL);
errCode = clFinish(commandQueue);
checkErr(errCode, "clfinish(commandqueue)");
checkErr(clReleaseCommandQueue(commandQueue), "clReleaseCommandQueue");
clGetCommandQueueInfo( commandQueue, CL_QUEUE_REFERENCE_COUNT, sizeof(cl_uint), &count, NULL);
errCode
возвращает cl_success
который показывает, что очередь команд завершена. Но когда я освобождаю очередь команд и получаю count
, он возвращает ноль, что означает, что некоторые очереди команд еще не завершены, так что память очереди команд все еще используется.
Это примечания clReleaseCommandqueueu
.
After the command_queue reference count becomes zero and all commands queued to command_queue have finished (e.g., kernel executions, memory object updates, etc.), the command-queue is deleted.