@@ -295,7 +295,7 @@ struct OclRuntime::Exports {
295
295
}
296
296
va_end (args);
297
297
298
- if (ctx->preserveOrder ) {
298
+ if (ctx->createEvents ) {
299
299
cl_event event = nullptr ;
300
300
err = clEnqueueNDRangeKernel (ctx->queue , cloned.kernel , 3 , nullptr ,
301
301
kernel->globalSize , kernel->localSize ,
@@ -541,7 +541,7 @@ llvm::Expected<bool> OclRuntime::usmFree(const void *ptr) const {
541
541
llvm::Expected<bool > OclRuntime::usmCpy (OclContext &ctx, const void *src,
542
542
void *dst, size_t size) const {
543
543
cl_int err;
544
- if (ctx.preserveOrder ) {
544
+ if (ctx.createEvents ) {
545
545
cl_event event;
546
546
err = ext.clEnqueueMemcpyINTEL (ctx.queue , false , dst, src, size,
547
547
ctx.waitListLen , ctx.waitList , &event);
@@ -572,16 +572,69 @@ void OclRuntime::debug(const char *file, int line, const char *msg) {
572
572
}
573
573
#endif
574
574
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
+
575
599
llvm::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 {
580
635
waitListLen = 0 ;
581
636
waitList = nullptr ;
582
- lastEvent = nullptr ;
583
637
}
584
- return true ;
585
638
}
586
639
587
640
OclModule::~OclModule () {
0 commit comments