@@ -295,7 +295,7 @@ struct OclRuntime::Exports {
295295 }
296296 va_end (args);
297297
298- if (ctx->preserveOrder ) {
298+ if (ctx->createEvents ) {
299299 cl_event event = nullptr ;
300300 err = clEnqueueNDRangeKernel (ctx->queue , cloned.kernel , 3 , nullptr ,
301301 kernel->globalSize , kernel->localSize ,
@@ -541,7 +541,7 @@ llvm::Expected<bool> OclRuntime::usmFree(const void *ptr) const {
541541llvm::Expected<bool > OclRuntime::usmCpy (OclContext &ctx, const void *src,
542542 void *dst, size_t size) const {
543543 cl_int err;
544- if (ctx.preserveOrder ) {
544+ if (ctx.createEvents ) {
545545 cl_event event;
546546 err = ext.clEnqueueMemcpyINTEL (ctx.queue , false , dst, src, size,
547547 ctx.waitListLen , ctx.waitList , &event);
@@ -572,16 +572,69 @@ void OclRuntime::debug(const char *file, int line, const char *msg) {
572572}
573573#endif
574574
575+ OclContext::OclContext (const OclRuntime &runtime, cl_command_queue queue,
576+ bool createEvents, cl_uint waitListLen,
577+ cl_event *waitList)
578+ : runtime(runtime), queue(queue), createEvents(createEvents),
579+ waitListLen (createEvents ? waitListLen : 0 ),
580+ waitList(createEvents ? waitList : nullptr ), lastEvent(nullptr ),
581+ clPtrs(nullptr ) {
582+ assert (!OclRuntime::isOutOfOrder (queue) || createEvents);
583+ assert (createEvents || (waitListLen == 0 && waitList == nullptr ));
584+ for (cl_uint i = 0 ; i < waitListLen; i++) {
585+ gcLogD (" Retaining OpenCL event: " , waitList[i]);
586+ CL_CHECKR (clRetainEvent (waitList[i]),
587+ " Failed to retain OpenCL event: " , waitList[i]);
588+ }
589+ }
590+
591+ OclContext::~OclContext () {
592+ for (cl_uint i = 0 ; i < waitListLen; i++) {
593+ gcLogD (" Releasing OpenCL event: " , waitList[i]);
594+ CL_CHECKR (clReleaseEvent (waitList[i]),
595+ " Failed to release OpenCL event: " , waitList[i]);
596+ }
597+ }
598+
575599llvm::Expected<bool > OclContext::finish () {
576- gcLogD (" Waiting for the enqueued OpenCL commands to finish: " , queue);
577- CL_CHECK (clFinish (queue),
578- " Failed to finish the OpenCL command queue: " , queue);
579- if (preserveOrder) {
600+ if (createEvents) {
601+ if (waitListLen) {
602+ gcLogD (" Waiting for " , waitListLen, " OpenCL events to finish." );
603+ CL_CHECK (clWaitForEvents (waitListLen, waitList),
604+ " Failed to wait for OpenCL events." );
605+
606+ for (cl_uint i = 0 ; i < waitListLen; i++) {
607+ gcLogD (" Releasing OpenCL event: " , waitList[i]);
608+ CL_CHECK (clReleaseEvent (waitList[i]),
609+ " Failed to release OpenCL event: " , waitList[i]);
610+ }
611+ waitListLen = 0 ;
612+ waitList = nullptr ;
613+ }
614+ } else {
615+ gcLogD (" Waiting for the enqueued OpenCL commands to finish: " , queue);
616+ CL_CHECK (clFinish (queue),
617+ " Failed to finish the OpenCL command queue: " , queue);
618+ }
619+ return true ;
620+ }
621+
622+ void OclContext::setLastEvent (cl_event event) {
623+ for (cl_uint i = 0 ; i < waitListLen; i++) {
624+ gcLogD (" Releasing OpenCL event: " , waitList[i]);
625+ CL_CHECKR (clReleaseEvent (waitList[i]),
626+ " Failed to release OpenCL event: " , waitList[i]);
627+ }
628+
629+ gcLogD (" Setting the last OpenCL event: " , event);
630+ lastEvent = event;
631+ if (event) {
632+ waitListLen = 1 ;
633+ waitList = &lastEvent;
634+ } else {
580635 waitListLen = 0 ;
581636 waitList = nullptr ;
582- lastEvent = nullptr ;
583637 }
584- return true ;
585638}
586639
587640OclModule::~OclModule () {
0 commit comments