diff --git a/sycl/include/sycl/ext/oneapi/experimental/graph.hpp b/sycl/include/sycl/ext/oneapi/experimental/graph.hpp index 0bca7ef840a97..bed78046140bf 100644 --- a/sycl/include/sycl/ext/oneapi/experimental/graph.hpp +++ b/sycl/include/sycl/ext/oneapi/experimental/graph.hpp @@ -12,6 +12,7 @@ #include // for context #include // for __SYCL_EXPORT #include // for kernel_param_kind_t +#include // for OwnerLessBase #include // for DataLessPropKind, PropWith... #ifdef __INTEL_PREVIEW_BREAKING_CHANGES #include @@ -239,7 +240,8 @@ class __SYCL_EXPORT dynamic_command_group { namespace detail { // Templateless modifiable command-graph base class. -class __SYCL_EXPORT modifiable_command_graph { +class __SYCL_EXPORT modifiable_command_graph + : public sycl::detail::OwnerLessBase { public: /// Constructor. /// @param SyclContext Context to use for graph. @@ -401,7 +403,8 @@ inline } // Templateless executable command-graph base class. -class __SYCL_EXPORT executable_command_graph { +class __SYCL_EXPORT executable_command_graph + : public sycl::detail::OwnerLessBase { public: /// An executable command-graph is not user constructable. executable_command_graph() = delete; diff --git a/sycl/include/sycl/ext/oneapi/owner_less.hpp b/sycl/include/sycl/ext/oneapi/owner_less.hpp index 55e4d25b904d0..444cd21b34179 100644 --- a/sycl/include/sycl/ext/oneapi/owner_less.hpp +++ b/sycl/include/sycl/ext/oneapi/owner_less.hpp @@ -8,19 +8,20 @@ #pragma once -#include // for access_mode -#include // for host_acce... -#include // for accessor -#include // for context -#include // for device -#include // for event -#include // for weak_object -#include // for kernel -#include // for bundle_state -#include // for platform -#include // for sampled_i... -#include // for queue -#include // for stream +#include // for access_mode +#include // for host_acce... +#include // for accessor +#include // for context +#include // for device +#include // for event +#include // for command_graph +#include // for weak_object +#include // for kernel +#include // for bundle_state +#include // for platform +#include // for sampled_i... +#include // for queue +#include // for stream namespace sycl { inline namespace _V1 { @@ -129,6 +130,10 @@ struct owner_less> : public detail::owner_less_base< host_sampled_image_accessor> {}; +template +struct owner_less> + : public detail::owner_less_base> {}; + } // namespace ext::oneapi } // namespace _V1 } // namespace sycl diff --git a/sycl/test/abi/sycl_symbols_windows.dump b/sycl/test/abi/sycl_symbols_windows.dump index 023152dfc1082..e8d3186745074 100644 --- a/sycl/test/abi/sycl_symbols_windows.dump +++ b/sycl/test/abi/sycl_symbols_windows.dump @@ -509,10 +509,14 @@ ??4?$OwnerLessBase@Vdevice@_V1@sycl@@@detail@_V1@sycl@@QEAAAEAV0123@AEBV0123@@Z ??4?$OwnerLessBase@Vevent@_V1@sycl@@@detail@_V1@sycl@@QEAAAEAV0123@$$QEAV0123@@Z ??4?$OwnerLessBase@Vevent@_V1@sycl@@@detail@_V1@sycl@@QEAAAEAV0123@AEBV0123@@Z +??4?$OwnerLessBase@Vexecutable_command_graph@detail@experimental@oneapi@ext@_V1@sycl@@@detail@_V1@sycl@@QEAAAEAV0123@$$QEAV0123@@Z +??4?$OwnerLessBase@Vexecutable_command_graph@detail@experimental@oneapi@ext@_V1@sycl@@@detail@_V1@sycl@@QEAAAEAV0123@AEBV0123@@Z ??4?$OwnerLessBase@Vkernel@_V1@sycl@@@detail@_V1@sycl@@QEAAAEAV0123@$$QEAV0123@@Z ??4?$OwnerLessBase@Vkernel@_V1@sycl@@@detail@_V1@sycl@@QEAAAEAV0123@AEBV0123@@Z ??4?$OwnerLessBase@Vkernel_id@_V1@sycl@@@detail@_V1@sycl@@QEAAAEAV0123@$$QEAV0123@@Z ??4?$OwnerLessBase@Vkernel_id@_V1@sycl@@@detail@_V1@sycl@@QEAAAEAV0123@AEBV0123@@Z +??4?$OwnerLessBase@Vmodifiable_command_graph@detail@experimental@oneapi@ext@_V1@sycl@@@detail@_V1@sycl@@QEAAAEAV0123@$$QEAV0123@@Z +??4?$OwnerLessBase@Vmodifiable_command_graph@detail@experimental@oneapi@ext@_V1@sycl@@@detail@_V1@sycl@@QEAAAEAV0123@AEBV0123@@Z ??4?$OwnerLessBase@Vphysical_mem@experimental@oneapi@ext@_V1@sycl@@@detail@_V1@sycl@@QEAAAEAV0123@$$QEAV0123@@Z ??4?$OwnerLessBase@Vphysical_mem@experimental@oneapi@ext@_V1@sycl@@@detail@_V1@sycl@@QEAAAEAV0123@AEBV0123@@Z ??4?$OwnerLessBase@Vplatform@_V1@sycl@@@detail@_V1@sycl@@QEAAAEAV0123@$$QEAV0123@@Z @@ -3856,10 +3860,14 @@ ?ext_oneapi_owner_before@?$OwnerLessBase@Vdevice@_V1@sycl@@@detail@_V1@sycl@@QEBA_NAEBVdevice@34@@Z ?ext_oneapi_owner_before@?$OwnerLessBase@Vevent@_V1@sycl@@@detail@_V1@sycl@@QEBA_NAEBV?$weak_object_base@Vevent@_V1@sycl@@@2oneapi@ext@34@@Z ?ext_oneapi_owner_before@?$OwnerLessBase@Vevent@_V1@sycl@@@detail@_V1@sycl@@QEBA_NAEBVevent@34@@Z +?ext_oneapi_owner_before@?$OwnerLessBase@Vexecutable_command_graph@detail@experimental@oneapi@ext@_V1@sycl@@@detail@_V1@sycl@@QEBA_NAEBV?$weak_object_base@Vexecutable_command_graph@detail@experimental@oneapi@ext@_V1@sycl@@@2oneapi@ext@34@@Z +?ext_oneapi_owner_before@?$OwnerLessBase@Vexecutable_command_graph@detail@experimental@oneapi@ext@_V1@sycl@@@detail@_V1@sycl@@QEBA_NAEBVexecutable_command_graph@2experimental@oneapi@ext@34@@Z ?ext_oneapi_owner_before@?$OwnerLessBase@Vkernel@_V1@sycl@@@detail@_V1@sycl@@QEBA_NAEBV?$weak_object_base@Vkernel@_V1@sycl@@@2oneapi@ext@34@@Z ?ext_oneapi_owner_before@?$OwnerLessBase@Vkernel@_V1@sycl@@@detail@_V1@sycl@@QEBA_NAEBVkernel@34@@Z ?ext_oneapi_owner_before@?$OwnerLessBase@Vkernel_id@_V1@sycl@@@detail@_V1@sycl@@QEBA_NAEBV?$weak_object_base@Vkernel_id@_V1@sycl@@@2oneapi@ext@34@@Z ?ext_oneapi_owner_before@?$OwnerLessBase@Vkernel_id@_V1@sycl@@@detail@_V1@sycl@@QEBA_NAEBVkernel_id@34@@Z +?ext_oneapi_owner_before@?$OwnerLessBase@Vmodifiable_command_graph@detail@experimental@oneapi@ext@_V1@sycl@@@detail@_V1@sycl@@QEBA_NAEBV?$weak_object_base@Vmodifiable_command_graph@detail@experimental@oneapi@ext@_V1@sycl@@@2oneapi@ext@34@@Z +?ext_oneapi_owner_before@?$OwnerLessBase@Vmodifiable_command_graph@detail@experimental@oneapi@ext@_V1@sycl@@@detail@_V1@sycl@@QEBA_NAEBVmodifiable_command_graph@2experimental@oneapi@ext@34@@Z ?ext_oneapi_owner_before@?$OwnerLessBase@Vphysical_mem@experimental@oneapi@ext@_V1@sycl@@@detail@_V1@sycl@@QEBA_NAEBV?$weak_object_base@Vphysical_mem@experimental@oneapi@ext@_V1@sycl@@@2oneapi@ext@34@@Z ?ext_oneapi_owner_before@?$OwnerLessBase@Vphysical_mem@experimental@oneapi@ext@_V1@sycl@@@detail@_V1@sycl@@QEBA_NAEBVphysical_mem@experimental@oneapi@ext@34@@Z ?ext_oneapi_owner_before@?$OwnerLessBase@Vplatform@_V1@sycl@@@detail@_V1@sycl@@QEBA_NAEBV?$weak_object_base@Vplatform@_V1@sycl@@@2oneapi@ext@34@@Z diff --git a/sycl/unittests/Extensions/CommandGraph/CommandGraph.cpp b/sycl/unittests/Extensions/CommandGraph/CommandGraph.cpp index 6ac141528a589..198c6a09fcf1e 100644 --- a/sycl/unittests/Extensions/CommandGraph/CommandGraph.cpp +++ b/sycl/unittests/Extensions/CommandGraph/CommandGraph.cpp @@ -7,9 +7,49 @@ //===----------------------------------------------------------------------===// #include "Common.hpp" +#include + using namespace sycl; using namespace sycl::ext::oneapi; +// Helper function for testing weak_object and owner_less for different graph +// types +template +void TestGraphTypeInMaps(const T &Graph1, const T &Graph2) { + weak_object WeakGraph1 = Graph1; + weak_object WeakGraph2 = Graph2; + + // Use the graph type directly in a map + std::map> GraphMap; + ASSERT_NO_THROW(GraphMap.insert({Graph1, 1})); + ASSERT_NO_THROW(GraphMap.insert({Graph2, 2})); + + // Use the weak_object graph type in a map + std::map, int, owner_less> WeakGraphMap; + ASSERT_NO_THROW(WeakGraphMap.insert({WeakGraph1, 1})); + ASSERT_NO_THROW(WeakGraphMap.insert({WeakGraph2, 2})); +} + +// Test creating and using ext::oneapi::weak_object and owner_less for +// command_graph class in a map +TEST_F(CommandGraphTest, OwnerLessGraph) { + + using ModifiableGraphT = + experimental::command_graph; + using ExecutableGraphT = + experimental::command_graph; + experimental::command_graph Graph2{Queue.get_context(), Dev}; + + // Test the default template parameter command_graph explicitly + TestGraphTypeInMaps>(Graph, Graph2); + + TestGraphTypeInMaps(Graph, Graph2); + + auto ExecGraph = Graph.finalize(); + auto ExecGraph2 = Graph2.finalize(); + TestGraphTypeInMaps(ExecGraph, ExecGraph2); +} + TEST_F(CommandGraphTest, AddNode) { auto GraphImpl = sycl::detail::getSyclObjImpl(Graph);