88
99#pragma once
1010
11+ #include " sycl/ext/oneapi/experimental/graph.hpp"
12+ #include < cstddef>
1113#include < sycl/accessor.hpp> // for detail::AccessorBaseHost
1214#include < sycl/context.hpp> // for context
1315#include < sycl/detail/export.hpp> // for __SYCL_EXPORT
1719#ifdef __INTEL_PREVIEW_BREAKING_CHANGES
1820#include < sycl/detail/string_view.hpp>
1921#endif
20- #include < sycl/device.hpp> // for device
22+ #include < sycl/device.hpp> // for device
2123#include < sycl/ext/oneapi/experimental/detail/properties/graph_properties.hpp> // for graph properties classes
24+ #include < sycl/ext/oneapi/experimental/work_group_memory.hpp> // for dynamic_work_group_memory
2225#include < sycl/nd_range.hpp> // for range, nd_range
2326#include < sycl/properties/property_traits.hpp> // for is_property, is_property_of
2427#include < sycl/property_list.hpp> // for property_list
@@ -485,6 +488,10 @@ class command_graph<graph_state::executable>
485488namespace detail {
486489class __SYCL_EXPORT dynamic_parameter_base {
487490public:
491+ dynamic_parameter_base () = default ;
492+ dynamic_parameter_base (
493+ sycl::ext::oneapi::experimental::command_graph<graph_state::modifiable>
494+ Graph);
488495 dynamic_parameter_base (
489496 sycl::ext::oneapi::experimental::command_graph<graph_state::modifiable>
490497 Graph,
@@ -509,14 +516,72 @@ class __SYCL_EXPORT dynamic_parameter_base {
509516 void updateValue (const raw_kernel_arg *NewRawValue, size_t Size);
510517
511518 void updateAccessor (const sycl::detail::AccessorBaseHost *Acc);
519+
520+ void updateWorkGroupMem (size_t BufferSize);
521+
512522 std::shared_ptr<dynamic_parameter_impl> impl;
513523
514524 template <class Obj >
515525 friend const decltype (Obj::impl) &
516526 sycl::detail::getSyclObjImpl(const Obj &SyclObject);
517527};
528+
518529} // namespace detail
519530
531+ template <typename T> struct is_unbounded_array : std::false_type {};
532+
533+ template <typename T> struct is_unbounded_array <T[]> : std::true_type {};
534+
535+ template <typename T>
536+ inline constexpr bool is_unbounded_array_v = is_unbounded_array<T>::value;
537+
538+ template <typename DataT,
539+ typename = std::enable_if_t <is_unbounded_array_v<DataT>>>
540+
541+ class __SYCL_SPECIAL_CLASS
542+ __SYCL_TYPE (dynamic_work_group_memory) dynamic_work_group_memory
543+ #ifdef __SYCL_DEVICE_ONLY__
544+ : detail::dynamic_parameter_base
545+ #else
546+ : public detail::dynamic_parameter_base
547+ #endif
548+ {
549+ public:
550+ dynamic_work_group_memory () = default ;
551+ // / Constructs a new dynamic_work_group_memory object.
552+ // / @param Graph The graph associated with this object.
553+ // / @param Num Number of elements in the unbounded array DataT.
554+ dynamic_work_group_memory (
555+ experimental::command_graph<graph_state::modifiable> Graph, size_t Num) {
556+ auto &WorkGroupMemImpl =
557+ static_cast <detail::work_group_memory_impl &>(WorkGroupMem);
558+ WorkGroupMemImpl.buffer_size = Num * sizeof (std::remove_extent_t <DataT>);
559+ }
560+
561+ // / Updates this dynamic_work_group_memory and all registered nodes with a new
562+ // / number of elements.
563+ // / @param Num The new number of elements in the unbounded array.
564+ void update (size_t Num) {
565+ #ifndef __SYCL_DEVICE_ONLY__
566+ detail::dynamic_parameter_base::updateWorkGroupMem (
567+ Num * sizeof (std::remove_extent_t <DataT>));
568+ #endif
569+ }
570+
571+ const work_group_memory<DataT> &get () const { return WorkGroupMem; }
572+
573+ private:
574+ work_group_memory<DataT> WorkGroupMem;
575+ #ifdef __SYCL_DEVICE_ONLY__
576+ // [[maybe_unused]] char padding[sizeof(detail::dynamic_parameter_base)];
577+ using value_type = std::remove_all_extents_t <DataT>;
578+ using decoratedPtr = typename sycl::detail::DecoratedType<
579+ value_type, access::address_space::local_space>::type *;
580+
581+ void __init (decoratedPtr Ptr) { this ->WorkGroupMem .__init (Ptr); }
582+ #endif
583+ };
584+
520585template <typename ValueT>
521586class dynamic_parameter : public detail ::dynamic_parameter_base {
522587 static constexpr bool IsAccessor =
0 commit comments