docc 0.8.3 (0d44999b)
C++ API Reference
Loading...
Searching...
No Matches
gpu_mma_dispatcher.h
Go to the documentation of this file.
1#pragma once
2
3#include <functional>
4#include <memory>
5#include <optional>
6#include <string>
7#include <utility>
8#include <vector>
9
12#include "sdfg/types/type.h"
13
14namespace sdfg::gpu {
15
24public:
26 using EltwiseCompute = std::function<void(
28 const std::string& main_frag_elem,
29 const std::string& idx,
30 const std::vector<std::string>& other_frag_elems
31 )>;
32
33 virtual ~GpuMmaDispatcherStrategy() = default;
34
37 }
38
40 virtual void
41 emit_fill(codegen::CodegenOutput& out, const std::string& acc_frag, types::PrimitiveType fill_type) const = 0;
42
44 virtual void emit_mma(
46 const std::string& frag_d,
47 const std::string& frag_a,
48 const std::string& frag_b,
49 const std::string& frag_c
50 ) const = 0;
51
53 virtual void emit_fragment_load(
55 const std::string& frag,
56 const std::string& base,
57 const GpuMmaFromMemoryLayout& layout,
58 MmaFragmentType frag_type,
59 types::PrimitiveType element_type,
60 MmaFragmentLayout fragment_layout
61 ) const = 0;
62
64 virtual void emit_fragment_store(
66 const std::string& frag,
67 const std::string& base,
68 const GpuMmaFromMemoryLayout& layout,
69 MmaFragmentType frag_type,
70 types::PrimitiveType element_type
71 ) const = 0;
72
74 virtual void emit_eltwise(
76 const std::string& main_frag,
77 const std::vector<std::string>& additional_frags,
78 const EltwiseCompute& compute
79 ) const = 0;
80
82 virtual std::string fragment_element(const std::string& frag, const std::string& idx) const {
83 throw std::runtime_error("GpuMmaDispatcherStrategy: clipped fragment transfers are not supported");
84 }
85
87 virtual std::string fragment_element_count(const std::string& frag) const {
88 throw std::runtime_error("GpuMmaDispatcherStrategy: clipped fragment transfers are not supported");
89 }
90
94 virtual std::optional<std::pair<std::string, std::string>> fragment_element_coords(
95 MmaFragmentType frag_type, const MmaBlockSize& block_size, const std::string& idx, std::string& condition
96 ) const {
97 return std::nullopt;
98 }
99};
100
109 const GpuMmaDispatcherStrategy& strategy,
110 bool load,
111 const std::string& frag,
112 const std::string& base,
113 const GpuMmaFromMemoryLayout& layout,
114 const MmaBlockSize& block_size,
115 MmaFragmentType frag_type,
116 types::PrimitiveType element_type,
117 MmaFragmentLayout fragment_layout
118);
119
122protected:
123 std::unique_ptr<GpuMmaDispatcherStrategy> strategy_;
124
125public:
127 codegen::LanguageExtension& language_extension,
128 const Function& function,
129 const data_flow::DataFlowGraph& data_flow_graph,
130 const data_flow::LibraryNode& node,
131 std::unique_ptr<GpuMmaDispatcherStrategy> strategy
132 )
133 : LibraryNodeDispatcher(language_extension, function, data_flow_graph, node), strategy_(std::move(strategy)) {
134 }
135};
136
139public:
141
144 std::vector<codegen::DispatchInput>& inputs,
145 std::vector<codegen::DispatchOutput>& outputs
146 ) override;
147};
148
151public:
153
156 std::vector<codegen::DispatchInput>& inputs,
157 std::vector<codegen::DispatchOutput>& outputs
158 ) override;
159};
160
163public:
165
168 std::vector<codegen::DispatchInput>& inputs,
169 std::vector<codegen::DispatchOutput>& outputs
170 ) override;
171};
172
175public:
177
180 std::vector<codegen::DispatchInput>& inputs,
181 std::vector<codegen::DispatchOutput>& outputs
182 ) override;
183};
184
187public:
189
192 std::vector<codegen::DispatchInput>& inputs,
193 std::vector<codegen::DispatchOutput>& outputs
194 ) override;
195};
196
197} // namespace sdfg::gpu
Dispatchers for dataflow blocks and library nodes.
Definition function.h:43
Definition language_extension.h:39
Base class for library node code generation dispatchers.
Definition block_dispatcher.h:163
LibraryNodeDispatcher(LanguageExtension &language_extension, const Function &function, const data_flow::DataFlowGraph &data_flow_graph, const data_flow::LibraryNode &node)
Construct a library node dispatcher.
Definition data_flow_graph.h:29
Base class for all library nodes in the dataflow graph.
Definition library_node.h:106
Hardware-dependent emit primitives for the composable MMA library nodes.
Definition gpu_mma_dispatcher.h:23
std::function< void( codegen::CodegenOutput &out, const std::string &main_frag_elem, const std::string &idx, const std::vector< std::string > &other_frag_elems)> EltwiseCompute
Per-element callback used by emit_eltwise: writes one output element from its inputs.
Definition gpu_mma_dispatcher.h:26
virtual void emit_fragment_store(codegen::CodegenOutput &out, const std::string &frag, const std::string &base, const GpuMmaFromMemoryLayout &layout, MmaFragmentType frag_type, types::PrimitiveType element_type) const =0
Store the fragment behind frag to memory (base + layout).
virtual std::optional< std::pair< std::string, std::string > > fragment_element_coords(MmaFragmentType frag_type, const MmaBlockSize &block_size, const std::string &idx, std::string &condition) const
Analytic (row, col) block coordinates of this lane's element idx, if the fragment's register layout i...
Definition gpu_mma_dispatcher.h:94
virtual std::string fragment_element(const std::string &frag, const std::string &idx) const
Expression for element idx of this lane's share of frag (needed for clipped transfers).
Definition gpu_mma_dispatcher.h:82
virtual void emit_fragment_load(codegen::CodegenOutput &out, const std::string &frag, const std::string &base, const GpuMmaFromMemoryLayout &layout, MmaFragmentType frag_type, types::PrimitiveType element_type, MmaFragmentLayout fragment_layout) const =0
Load a tile from memory (base + layout) into the fragment behind frag.
virtual void emit_eltwise(codegen::CodegenOutput &out, const std::string &main_frag, const std::vector< std::string > &additional_frags, const EltwiseCompute &compute) const =0
Element-wise loop over main_frag, invoking compute for each element.
virtual ~GpuMmaDispatcherStrategy()=default
virtual void emit_fill(codegen::CodegenOutput &out, const std::string &acc_frag, types::PrimitiveType fill_type) const =0
Zero-initialize the accumulator fragment behind acc_frag.
virtual void emit_needed_declarations(codegen::CodegenOutput &out) const
Target library includes / helper declarations needed before the first emit.
Definition gpu_mma_dispatcher.h:36
virtual std::string fragment_element_count(const std::string &frag) const
Number of elements of this lane's share of frag (needed for clipped transfers).
Definition gpu_mma_dispatcher.h:87
virtual void emit_mma(codegen::CodegenOutput &out, const std::string &frag_d, const std::string &frag_a, const std::string &frag_b, const std::string &frag_c) const =0
frag_d = frag_a * frag_b + frag_c (single MMA step; all operands are fragments).
D = out_type(Acc + acc_type(C)), element-wise over the fragments (gpu::GpuMmaFragmentEltwiseAdd).
Definition gpu_mma_dispatcher.h:186
GpuMmaNodeDispatcher(codegen::LanguageExtension &language_extension, const Function &function, const data_flow::DataFlowGraph &data_flow_graph, const data_flow::LibraryNode &node, std::unique_ptr< GpuMmaDispatcherStrategy > strategy)
Definition gpu_mma_dispatcher.h:126
void dispatch_code_with_edges(codegen::CodegenOutput &out, std::vector< codegen::DispatchInput > &inputs, std::vector< codegen::DispatchOutput > &outputs) override
Declare and zero-initialize an MMA accumulator fragment (gpu::GpuMmaFill).
Definition gpu_mma_dispatcher.h:150
GpuMmaNodeDispatcher(codegen::LanguageExtension &language_extension, const Function &function, const data_flow::DataFlowGraph &data_flow_graph, const data_flow::LibraryNode &node, std::unique_ptr< GpuMmaDispatcherStrategy > strategy)
Definition gpu_mma_dispatcher.h:126
void dispatch_code_with_edges(codegen::CodegenOutput &out, std::vector< codegen::DispatchInput > &inputs, std::vector< codegen::DispatchOutput > &outputs) override
Load a tile from memory into a fragment (gpu::GpuMmaFragmentLoad).
Definition gpu_mma_dispatcher.h:162
GpuMmaNodeDispatcher(codegen::LanguageExtension &language_extension, const Function &function, const data_flow::DataFlowGraph &data_flow_graph, const data_flow::LibraryNode &node, std::unique_ptr< GpuMmaDispatcherStrategy > strategy)
Definition gpu_mma_dispatcher.h:126
void dispatch_code_with_edges(codegen::CodegenOutput &out, std::vector< codegen::DispatchInput > &inputs, std::vector< codegen::DispatchOutput > &outputs) override
Store a fragment to a tile in memory (gpu::GpuMmaFragmentStore).
Definition gpu_mma_dispatcher.h:174
GpuMmaNodeDispatcher(codegen::LanguageExtension &language_extension, const Function &function, const data_flow::DataFlowGraph &data_flow_graph, const data_flow::LibraryNode &node, std::unique_ptr< GpuMmaDispatcherStrategy > strategy)
Definition gpu_mma_dispatcher.h:126
void dispatch_code_with_edges(codegen::CodegenOutput &out, std::vector< codegen::DispatchInput > &inputs, std::vector< codegen::DispatchOutput > &outputs) override
A single MMA accumulation of A * B into a preinitialized accumulator (gpu::GpuMmaMatmul).
Definition gpu_mma_dispatcher.h:138
GpuMmaNodeDispatcher(codegen::LanguageExtension &language_extension, const Function &function, const data_flow::DataFlowGraph &data_flow_graph, const data_flow::LibraryNode &node, std::unique_ptr< GpuMmaDispatcherStrategy > strategy)
Definition gpu_mma_dispatcher.h:126
void dispatch_code_with_edges(codegen::CodegenOutput &out, std::vector< codegen::DispatchInput > &inputs, std::vector< codegen::DispatchOutput > &outputs) override
std::unique_ptr< GpuMmaDispatcherStrategy > strategy_
Definition gpu_mma_dispatcher.h:123
GpuMmaNodeDispatcher(codegen::LanguageExtension &language_extension, const Function &function, const data_flow::DataFlowGraph &data_flow_graph, const data_flow::LibraryNode &node, std::unique_ptr< GpuMmaDispatcherStrategy > strategy)
Definition gpu_mma_dispatcher.h:126
Definition cuda_arch.h:11
MmaFragmentLayout
Definition gpu_mma_fragment.h:78
void emit_clipped_fragment_transfer(codegen::CodegenOutput &out, const GpuMmaDispatcherStrategy &strategy, bool load, const std::string &frag, const std::string &base, const GpuMmaFromMemoryLayout &layout, const MmaBlockSize &block_size, MmaFragmentType frag_type, types::PrimitiveType element_type, MmaFragmentLayout fragment_layout)
Emit a fragment load/store whose layout is clipped (GpuMmaFromMemoryLayout::rows/cols): a wave-unifor...
MmaFragmentType
Definition gpu_mma_fragment.h:14
PrimitiveType
Enumeration of all primitive data types supported by sdfglib.
Definition type.h:35
Definition block_dispatcher.h:108
Describes how a single MMA fragment maps to memory relative to a base pointer.
Definition gpu_mma_fragment.h:163
Definition gpu_mma_fragment.h:16
Core type system definitions for sdfglib.