/home/docs/checkouts/readthedocs.org/user_builds/advanced-micro-devices-composable-kernel/checkouts/develop/include/ck_tile/ops/epilogue/chainer/epilogue_chainer.hpp Source File

/home/docs/checkouts/readthedocs.org/user_builds/advanced-micro-devices-composable-kernel/checkouts/develop/include/ck_tile/ops/epilogue/chainer/epilogue_chainer.hpp Source File#

Composable Kernel: /home/docs/checkouts/readthedocs.org/user_builds/advanced-micro-devices-composable-kernel/checkouts/develop/include/ck_tile/ops/epilogue/chainer/epilogue_chainer.hpp Source File
epilogue_chainer.hpp
Go to the documentation of this file.
1 // Copyright (c) Advanced Micro Devices, Inc., or its affiliates.
2 // SPDX-License-Identifier: MIT
3 
4 #pragma once
5 
6 #include "ck_tile/core.hpp"
8 
9 namespace ck_tile {
10 
19 template <typename Scheduler>
21 {
22  using Problem = typename Scheduler::ProblemType;
23  using BaseOp = typename Scheduler::BaseOp;
24 
25  using ODataType = typename BaseOp::ODataType;
26  using DsDataType = typename BaseOp::DsDataType;
27  using DsLayout = typename BaseOp::DsLayout;
28  using AccDataType = typename BaseOp::AccDataType;
29  static constexpr auto MemoryOperation = BaseOp::MemoryOperation;
30 
31  CK_TILE_HOST_DEVICE static constexpr index_t GetSmemSize() { return BaseOp::GetSmemSize(); }
32 
34  {
35  return BaseOp::GetVectorSizeC();
36  }
37 
38  template <index_t I>
40  {
41  return BaseOp::GetVectorSizeD(idx);
42  }
43 
44  CK_TILE_DEVICE static constexpr auto MakeLdsDistributionEncode()
45  {
46  return BaseOp::MakeLdsDistributionEncode();
47  }
48 
55  template <typename OutWindow, typename AccTile, typename AuxWindows, typename... Args>
56  CK_TILE_DEVICE void operator()(OutWindow& out_window,
57  const AccTile& acc_tile,
58  const AuxWindows& aux_windows,
59  void* p_smem,
60  Args&&... args) const
61  {
62  // The context serves as a shared workspace that maintains intermediate results
63  // and resources across multiple epilogue operations.
64  auto context = Scheduler::create_context(out_window, acc_tile, aux_windows, p_smem);
65  auto schedule = Scheduler::make_schedule(std::forward<Args>(args)...);
66  schedule(out_window, acc_tile, aux_windows, p_smem, context);
67  }
68 };
69 
79 template <typename EpilogueType, typename... Args>
81 {
82  using Epilogue = EpilogueType;
83  ck_tile::tuple<Args...> args;
84 
85  constexpr EpilogueNode(Args... a) : args(a...) {}
86 
88  template <typename OutWindow, typename AccTile, typename AuxWindows, typename Context>
89  CK_TILE_DEVICE void operator()(OutWindow& out_window,
90  const AccTile& acc_tile,
91  const AuxWindows& aux_windows,
92  void* p_smem,
93  Context& context) const
94  {
96  [&](auto&&... epilogue_args) {
97  EpilogueType{}(out_window,
98  acc_tile,
99  aux_windows,
100  p_smem,
101  context,
102  std::forward<decltype(epilogue_args)>(epilogue_args)...);
103  },
104  args);
105  }
106 
108  template <typename OutWindow,
109  typename AccTile,
110  typename AuxWindows,
111  typename Context,
112  index_t I>
113  CK_TILE_DEVICE void operator()(OutWindow& out_window,
114  const AccTile& acc_tile,
115  const AuxWindows& aux_windows,
116  void* p_smem,
117  Context& context,
118  number<I> iAccess) const
119  {
121  [&](auto&&... epilogue_args) {
122  EpilogueType{}(out_window,
123  acc_tile,
124  aux_windows,
125  p_smem,
126  iAccess,
127  context,
128  std::forward<decltype(epilogue_args)>(epilogue_args)...);
129  },
130  args);
131  }
132 };
133 
135 template <typename EpilogueType>
136 struct EpilogueNode<EpilogueType>
137 {
138  using Epilogue = EpilogueType;
140 
141  constexpr EpilogueNode() = default;
142 
143  template <typename OutWindow, typename AccTile, typename AuxWindows, typename Context>
144  CK_TILE_DEVICE void operator()(OutWindow& out_window,
145  const AccTile& acc_tile,
146  const AuxWindows& aux_windows,
147  void* p_smem,
148  Context& context) const
149  {
150  EpilogueType{}(out_window, acc_tile, aux_windows, p_smem, context);
151  }
152 
153  template <typename OutWindow,
154  typename AccTile,
155  typename AuxWindows,
156  typename Context,
157  index_t I>
158  CK_TILE_DEVICE void operator()(OutWindow& out_window,
159  const AccTile& acc_tile,
160  const AuxWindows& aux_windows,
161  void* p_smem,
162  Context& context,
163  number<I> iAccess) const
164  {
165  EpilogueType{}(out_window, acc_tile, aux_windows, p_smem, iAccess, context);
166  }
167 };
168 
173 template <index_t Steps, typename... EpilogueTypes>
175 {
176  ck_tile::tuple<EpilogueTypes...> epilogues;
177 
178  constexpr EpilogueGraph() = default;
179  constexpr EpilogueGraph(EpilogueTypes... eps) : epilogues(eps...) {}
180 
182  template <typename OutWindow, typename AccTile, typename AuxWindows, typename Context>
183  CK_TILE_DEVICE void operator()(OutWindow& out_window,
184  const AccTile& acc_tile,
185  const AuxWindows& aux_windows,
186  void* p_smem,
187  Context& context) const
188  {
189  // For each iteration, process all epilogues in order
190  static_for<0, Steps, 1>{}([&](auto iAccess) {
191  static_for<0, sizeof...(EpilogueTypes), 1>{}([&](auto I) {
192  epilogues.template get<I.value>()(
193  out_window, acc_tile, aux_windows, p_smem, context, iAccess);
194  });
195  });
196  }
197 };
198 
200 template <typename EpilogueType, typename... Args>
201 constexpr auto make_node(Args... args)
202 {
203  return EpilogueNode<EpilogueType, Args...>{args...};
204 }
205 
207 template <index_t Steps, typename... EpilogueTypes>
208 constexpr auto make_graph(EpilogueTypes... epilogues)
209 {
210  return EpilogueGraph<Steps, EpilogueTypes...>{epilogues...};
211 }
212 
213 } // namespace ck_tile
#define CK_TILE_DEVICE
Definition: config.hpp:45
#define CK_TILE_HOST_DEVICE
Definition: config.hpp:46
Definition: cluster_descriptor.hpp:13
constexpr decltype(auto) apply(F &&f, Tuple &&t)
Definition: tuple.hpp:526
int32_t index_t
Definition: integer.hpp:9
constexpr auto make_node(Args... args)
Helper function for creating epilogue nodes.
Definition: epilogue_chainer.hpp:201
constexpr auto make_graph(EpilogueTypes... epilogues)
Helper function for creating operation graphs.
Definition: epilogue_chainer.hpp:208
const GenericPointer< typename T::ValueType > T2 T::AllocatorType & a
Definition: pointer.h:1517
Epilogue Chainer - Modular epilogue processing facilitator.
Definition: epilogue_chainer.hpp:21
typename Scheduler::ProblemType Problem
Definition: epilogue_chainer.hpp:22
CK_TILE_DEVICE void operator()(OutWindow &out_window, const AccTile &acc_tile, const AuxWindows &aux_windows, void *p_smem, Args &&... args) const
Process epilogue through scheduler-defined operation graph.
Definition: epilogue_chainer.hpp:56
typename Scheduler::BaseOp BaseOp
Definition: epilogue_chainer.hpp:23
static constexpr CK_TILE_HOST_DEVICE index_t GetVectorSizeC()
Definition: epilogue_chainer.hpp:33
typename BaseOp::DsLayout DsLayout
Definition: epilogue_chainer.hpp:27
typename BaseOp::DsDataType DsDataType
Definition: epilogue_chainer.hpp:26
typename BaseOp::AccDataType AccDataType
Definition: epilogue_chainer.hpp:28
static constexpr CK_TILE_DEVICE auto MakeLdsDistributionEncode()
Definition: epilogue_chainer.hpp:44
static constexpr CK_TILE_HOST_DEVICE index_t GetVectorSizeD(number< I > idx)
Definition: epilogue_chainer.hpp:39
static constexpr auto MemoryOperation
Definition: epilogue_chainer.hpp:29
typename BaseOp::ODataType ODataType
Definition: epilogue_chainer.hpp:25
static constexpr CK_TILE_HOST_DEVICE index_t GetSmemSize()
Definition: epilogue_chainer.hpp:31
Operation graph that sequentially composes multiple epilogue operations.
Definition: epilogue_chainer.hpp:175
CK_TILE_DEVICE void operator()(OutWindow &out_window, const AccTile &acc_tile, const AuxWindows &aux_windows, void *p_smem, Context &context) const
Process all epilogues for each iteration in sequence.
Definition: epilogue_chainer.hpp:183
ck_tile::tuple< EpilogueTypes... > epilogues
Definition: epilogue_chainer.hpp:176
constexpr EpilogueGraph()=default
constexpr EpilogueGraph(EpilogueTypes... eps)
Definition: epilogue_chainer.hpp:179
CK_TILE_DEVICE void operator()(OutWindow &out_window, const AccTile &acc_tile, const AuxWindows &aux_windows, void *p_smem, Context &context) const
Definition: epilogue_chainer.hpp:144
CK_TILE_DEVICE void operator()(OutWindow &out_window, const AccTile &acc_tile, const AuxWindows &aux_windows, void *p_smem, Context &context, number< I > iAccess) const
Definition: epilogue_chainer.hpp:158
EpilogueType Epilogue
Definition: epilogue_chainer.hpp:138
ck_tile::tuple args
Definition: epilogue_chainer.hpp:139
Epilogue operation wrapper with arguments.
Definition: epilogue_chainer.hpp:81
EpilogueType Epilogue
Definition: epilogue_chainer.hpp:82
CK_TILE_DEVICE void operator()(OutWindow &out_window, const AccTile &acc_tile, const AuxWindows &aux_windows, void *p_smem, Context &context) const
Process epilogue without iteration index.
Definition: epilogue_chainer.hpp:89
constexpr EpilogueNode(Args... a)
Definition: epilogue_chainer.hpp:85
CK_TILE_DEVICE void operator()(OutWindow &out_window, const AccTile &acc_tile, const AuxWindows &aux_windows, void *p_smem, Context &context, number< I > iAccess) const
Process epilogue with iteration index.
Definition: epilogue_chainer.hpp:113
ck_tile::tuple< Args... > args
Definition: epilogue_chainer.hpp:83
Definition: integral_constant.hpp:13
Definition: functional.hpp:43
Definition: tuple.hpp:192