Skip to content

[SYCL] uninvoked commands cleanup #2472

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions sycl/include/CL/sycl/queue.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
10 changes: 10 additions & 0 deletions sycl/source/detail/queue_impl.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<event_impl> &EventImplWeakPtr : MEvents) {
if (std::shared_ptr<event_impl> EventImplPtr = EventImplWeakPtr.lock())
detail::Scheduler::getInstance().cleanupFinishedCommands(
std::move(EventImplPtr));
}
}

/// \return an OpenCL interoperability queue handle.
cl_command_queue get() {
if (!MHostQueue) {
Expand Down
5 changes: 5 additions & 0 deletions sycl/source/queue.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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(); }
Expand Down
8 changes: 5 additions & 3 deletions sycl/test/abi/sycl_symbols_linux.dump
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -4161,6 +4166,3 @@ _ZNK2cl4sycl9exception11has_contextEv
_ZNK2cl4sycl9exception4whatEv
__sycl_register_lib
__sycl_unregister_lib
_ZN2cl4sycl6detail11stream_impl15accessGlobalBufERNS0_7handlerE
_ZN2cl4sycl6detail11stream_impl20accessGlobalFlushBufERNS0_7handlerE
_ZN2cl4sycl6detail11stream_impl18accessGlobalOffsetERNS0_7handlerE
19 changes: 19 additions & 0 deletions sycl/test/basic_tests/queue/release.cpp
Original file line number Diff line number Diff line change
@@ -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 <CL/sycl.hpp>
int main() {
sycl::queue q;

q.single_task<class test>([]() {});
// no wait.

return 0;
}

//CHECK: ---> piEnqueueKernelLaunch(
//CHECK: ---> piEventRelease(
//CHECK: ---> piQueueRelease(
//CHECK: ---> piContextRelease(
//CHECK: ---> piKernelRelease(
//CHECK: ---> piProgramRelease(