diff --git a/sycl/include/CL/sycl/queue.hpp b/sycl/include/CL/sycl/queue.hpp index d3b7d3d718cdc..63241119350be 100644 --- a/sycl/include/CL/sycl/queue.hpp +++ b/sycl/include/CL/sycl/queue.hpp @@ -149,6 +149,8 @@ class __SYCL_EXPORT queue { queue(queue &&RHS) = default; + ~queue(); // forward declaration + queue &operator=(const queue &RHS) = default; queue &operator=(queue &&RHS) = default; diff --git a/sycl/source/detail/queue_impl.hpp b/sycl/source/detail/queue_impl.hpp index 7b1bf09317bc1..088abf882ce17 100644 --- a/sycl/source/detail/queue_impl.hpp +++ b/sycl/source/detail/queue_impl.hpp @@ -124,6 +124,16 @@ class queue_impl { } } + /// command resources are usually released from queue.wait(), but + /// if that is not invoked, then they may still need releasing. + void releaseUninvokedResources() { + for (std::weak_ptr &EventImplWeakPtr : MEvents) { + if (std::shared_ptr EventImplPtr = EventImplWeakPtr.lock()) + detail::Scheduler::getInstance().cleanupFinishedCommands( + std::move(EventImplPtr)); + } + } + /// \return an OpenCL interoperability queue handle. cl_command_queue get() { if (!MHostQueue) { diff --git a/sycl/source/queue.cpp b/sycl/source/queue.cpp index 21ec93eb5eb4a..72ab99e3c8664 100644 --- a/sycl/source/queue.cpp +++ b/sycl/source/queue.cpp @@ -66,6 +66,11 @@ queue::queue(const context &SyclContext, const device &SyclDevice, detail::getSyclObjImpl(SyclContext)->get_async_handler(), PropList) {} +queue::~queue() { + if (impl) + impl->releaseUninvokedResources(); +} + cl_command_queue queue::get() const { return impl->get(); } context queue::get_context() const { return impl->get_context(); } diff --git a/sycl/test/abi/sycl_symbols_linux.dump b/sycl/test/abi/sycl_symbols_linux.dump index 323961f0585aa..322f10fcb9291 100644 --- a/sycl/test/abi/sycl_symbols_linux.dump +++ b/sycl/test/abi/sycl_symbols_linux.dump @@ -3645,6 +3645,8 @@ _ZN2cl4sycl5queueC2ERKNS0_7contextERKNS0_15device_selectorERKNS0_13property_list _ZN2cl4sycl5queueC2ERKNS0_7contextERKNS0_15device_selectorERKSt8functionIFvNS0_14exception_listEEERKNS0_13property_listE _ZN2cl4sycl5queueC2ERKNS0_7contextERKNS0_6deviceERKNS0_13property_listE _ZN2cl4sycl5queueC2ERKNS0_7contextERKNS0_6deviceERKSt8functionIFvNS0_14exception_listEEERKNS0_13property_listE +_ZN2cl4sycl5queueD1Ev +_ZN2cl4sycl5queueD2Ev _ZN2cl4sycl6ONEAPI15filter_selectorC1ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE _ZN2cl4sycl6ONEAPI15filter_selectorC2ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE _ZN2cl4sycl6ONEAPI6detail16reduGetMaxWGSizeESt10shared_ptrINS0_6detail10queue_implEEm @@ -3720,6 +3722,9 @@ _ZN2cl4sycl6detail11SYCLMemObjT20getBufSizeForContextERKSt10shared_ptrINS1_12con _ZN2cl4sycl6detail11SYCLMemObjTC1EP7_cl_memRKNS0_7contextEmNS0_5eventESt10unique_ptrINS1_19SYCLMemObjAllocatorESt14default_deleteISA_EE _ZN2cl4sycl6detail11SYCLMemObjTC2EP7_cl_memRKNS0_7contextEmNS0_5eventESt10unique_ptrINS1_19SYCLMemObjAllocatorESt14default_deleteISA_EE _ZN2cl4sycl6detail11buffer_impl11allocateMemESt10shared_ptrINS1_12context_implEEbPvRP9_pi_event +_ZN2cl4sycl6detail11stream_impl15accessGlobalBufERNS0_7handlerE +_ZN2cl4sycl6detail11stream_impl18accessGlobalOffsetERNS0_7handlerE +_ZN2cl4sycl6detail11stream_impl20accessGlobalFlushBufERNS0_7handlerE _ZN2cl4sycl6detail11stream_impl5flushEv _ZN2cl4sycl6detail11stream_implC1EmmRNS0_7handlerE _ZN2cl4sycl6detail11stream_implC2EmmRNS0_7handlerE @@ -4161,6 +4166,3 @@ _ZNK2cl4sycl9exception11has_contextEv _ZNK2cl4sycl9exception4whatEv __sycl_register_lib __sycl_unregister_lib -_ZN2cl4sycl6detail11stream_impl15accessGlobalBufERNS0_7handlerE -_ZN2cl4sycl6detail11stream_impl20accessGlobalFlushBufERNS0_7handlerE -_ZN2cl4sycl6detail11stream_impl18accessGlobalOffsetERNS0_7handlerE diff --git a/sycl/test/basic_tests/queue/release.cpp b/sycl/test/basic_tests/queue/release.cpp new file mode 100644 index 0000000000000..0293d8b580414 --- /dev/null +++ b/sycl/test/basic_tests/queue/release.cpp @@ -0,0 +1,19 @@ +// RUN: %clangxx -fsycl -fsycl-targets=%sycl_triple %s -o %t.out +// RUN: env SYCL_PI_TRACE=2 %GPU_RUN_PLACEHOLDER %t.out | FileCheck %s + +#include +int main() { + sycl::queue q; + + q.single_task([]() {}); + // no wait. + + return 0; +} + +//CHECK: ---> piEnqueueKernelLaunch( +//CHECK: ---> piEventRelease( +//CHECK: ---> piQueueRelease( +//CHECK: ---> piContextRelease( +//CHECK: ---> piKernelRelease( +//CHECK: ---> piProgramRelease(