Halide 19.0.0
Halide compiler and libraries
Loading...
Searching...
No Matches
AutoScheduleUtils.h
Go to the documentation of this file.
1#ifndef HALIDE_INTERNAL_AUTO_SCHEDULE_UTILS_H
2#define HALIDE_INTERNAL_AUTO_SCHEDULE_UTILS_H
3
4/** \file
5 *
6 * Defines util functions that used by auto scheduler.
7 */
8
9#include <limits>
10#include <set>
11
12#include "Bounds.h"
13#include "Definition.h"
14#include "IRVisitor.h"
15#include "Interval.h"
16
17namespace Halide {
18namespace Internal {
19
20typedef std::map<std::string, Interval> DimBounds;
21
22const int64_t unknown = std::numeric_limits<int64_t>::min();
23
24/** Visitor for keeping track of functions that are directly called and the
25 * arguments with which they are called. */
26class FindAllCalls : public IRVisitor {
27 using IRVisitor::visit;
28
29 void visit(const Call *call) override {
30 if (call->call_type == Call::Halide || call->call_type == Call::Image) {
31 funcs_called.insert(call->name);
32 call_args.emplace_back(call->name, call->args);
33 }
34 for (const auto &arg : call->args) {
35 arg.accept(this);
36 }
37 }
38
39public:
40 std::set<std::string> funcs_called;
41 std::vector<std::pair<std::string, std::vector<Expr>>> call_args;
42};
43
44/** Return an int representation of 's'. Throw an error on failure. */
45int string_to_int(const std::string &s);
46
47/** Substitute every variable in an Expr or a Stmt with its estimate
48 * if specified. */
49//@{
52//@}
53
54/** Return the size of an interval. Return an undefined expr if the interval
55 * is unbounded. */
57
58/** Return the size of an n-d box. */
59Expr box_size(const Box &b);
60
61/** Helper function to print the bounds of a region. */
62void disp_regions(const std::map<std::string, Box> &regions);
63
64/** Return the corresponding definition of a function given the stage. This
65 * will throw an assertion if the function is an extern function (Extern Func
66 * does not have definition). */
67Definition get_stage_definition(const Function &f, int stage_num);
68
69/** Return the corresponding loop dimensions of a function given the stage.
70 * For extern Func, this will return a list of size 1 containing the
71 * dummy __outermost loop dimension. */
72std::vector<Dim> &get_stage_dims(const Function &f, int stage_num);
73
74/** Add partial load costs to the corresponding function in the result costs. */
75void combine_load_costs(std::map<std::string, Expr> &result,
76 const std::map<std::string, Expr> &partial);
77
78/** Return the required bounds of an intermediate stage (f, stage_num) of
79 * function 'f' given the bounds of the pure dimensions. */
80DimBounds get_stage_bounds(const Function &f, int stage_num, const DimBounds &pure_bounds);
81
82/** Return the required bounds for all the stages of the function 'f'. Each entry
83 * in the returned vector corresponds to a stage. */
84std::vector<DimBounds> get_stage_bounds(const Function &f, const DimBounds &pure_bounds);
85
86/** Recursively inline all the functions in the set 'inlines' into the
87 * expression 'e' and return the resulting expression. If 'order' is
88 * passed, inlining will be done in the reverse order of function realization
89 * to avoid extra inlining works. */
90Expr perform_inline(Expr e, const std::map<std::string, Function> &env,
91 const std::set<std::string> &inlines = std::set<std::string>(),
92 const std::vector<std::string> &order = std::vector<std::string>());
93
94/** Return all functions that are directly called by a function stage (f, stage). */
95std::set<std::string> get_parents(Function f, int stage);
96
97/** Return value of element within a map. This will assert if the element is not
98 * in the map. */
99// @{
100template<typename K, typename V>
101V get_element(const std::map<K, V> &m, const K &key) {
102 const auto &iter = m.find(key);
103 internal_assert(iter != m.end());
104 return iter->second;
105}
106
107template<typename K, typename V>
108V &get_element(std::map<K, V> &m, const K &key) {
109 const auto &iter = m.find(key);
110 internal_assert(iter != m.end());
111 return iter->second;
112}
113// @}
114
115/** If the cost of computing a Func is about the same as calling the Func,
116 * inline the Func. Return true of any of the Funcs is inlined. */
117bool inline_all_trivial_functions(const std::vector<Function> &outputs,
118 const std::vector<std::string> &order,
119 const std::map<std::string, Function> &env);
120
121/** Determine if a Func (order[index]) is only consumed by another single Func
122 * in element-wise manner. If it is, return the name of the consumer Func;
123 * otherwise, return an empty string. */
124std::string is_func_called_element_wise(const std::vector<std::string> &order, size_t index,
125 const std::map<std::string, Function> &env);
126
127/** Inline a Func if its values are only consumed by another single Func in
128 * element-wise manner. */
129bool inline_all_element_wise_functions(const std::vector<Function> &outputs,
130 const std::vector<std::string> &order,
131 const std::map<std::string, Function> &env);
132
134
135} // namespace Internal
136} // namespace Halide
137
138#endif
Methods for computing the upper and lower bounds of an expression, and the regions of a function read...
Defines the internal representation of a halide function's definition and related classes.
#define internal_assert(c)
Definition Errors.h:19
Defines the base class for things that recursively walk over the IR.
Defines the Interval class.
A Function definition which can either represent a init or an update definition.
Definition Definition.h:38
Visitor for keeping track of functions that are directly called and the arguments with which they are...
std::vector< std::pair< std::string, std::vector< Expr > > > call_args
std::set< std::string > funcs_called
A reference-counted handle to Halide's internal representation of a function.
Definition Function.h:39
A base class for algorithms that need to recursively walk over the IR.
Definition IRVisitor.h:19
virtual void visit(const IntImm *)
Expr box_size(const Box &b)
Return the size of an n-d box.
std::set< std::string > get_parents(Function f, int stage)
Return all functions that are directly called by a function stage (f, stage).
std::string is_func_called_element_wise(const std::vector< std::string > &order, size_t index, const std::map< std::string, Function > &env)
Determine if a Func (order[index]) is only consumed by another single Func in element-wise manner.
Expr perform_inline(Expr e, const std::map< std::string, Function > &env, const std::set< std::string > &inlines=std::set< std::string >(), const std::vector< std::string > &order=std::vector< std::string >())
Recursively inline all the functions in the set 'inlines' into the expression 'e' and return the resu...
DimBounds get_stage_bounds(const Function &f, int stage_num, const DimBounds &pure_bounds)
Return the required bounds of an intermediate stage (f, stage_num) of function 'f' given the bounds o...
Definition get_stage_definition(const Function &f, int stage_num)
Return the corresponding definition of a function given the stage.
Expr substitute_var_estimates(Expr e)
Substitute every variable in an Expr or a Stmt with its estimate if specified.
std::vector< Dim > & get_stage_dims(const Function &f, int stage_num)
Return the corresponding loop dimensions of a function given the stage.
void disp_regions(const std::map< std::string, Box > &regions)
Helper function to print the bounds of a region.
void propagate_estimate_test()
void combine_load_costs(std::map< std::string, Expr > &result, const std::map< std::string, Expr > &partial)
Add partial load costs to the corresponding function in the result costs.
V get_element(const std::map< K, V > &m, const K &key)
Return value of element within a map.
Expr get_extent(const Interval &i)
Return the size of an interval.
bool inline_all_trivial_functions(const std::vector< Function > &outputs, const std::vector< std::string > &order, const std::map< std::string, Function > &env)
If the cost of computing a Func is about the same as calling the Func, inline the Func.
std::map< std::string, Interval > DimBounds
const int64_t unknown
int string_to_int(const std::string &s)
Return an int representation of 's'.
bool inline_all_element_wise_functions(const std::vector< Function > &outputs, const std::vector< std::string > &order, const std::map< std::string, Function > &env)
Inline a Func if its values are only consumed by another single Func in element-wise manner.
This file defines the class FunctionDAG, which is our representation of a Halide pipeline,...
@ Internal
Not visible externally, similar to 'static' linkage in C.
signed __INT64_TYPE__ int64_t
A fragment of Halide syntax.
Definition Expr.h:258
Represents the bounds of a region of arbitrary dimension.
Definition Bounds.h:53
A function call.
Definition IR.h:490
@ Image
A load from an input image.
Definition IR.h:493
@ Halide
A call to a Func.
Definition IR.h:497
std::string name
Definition IR.h:491
CallType call_type
Definition IR.h:501
std::vector< Expr > args
Definition IR.h:492
A class to represent ranges of Exprs.
Definition Interval.h:14
A reference-counted handle to a statement node.
Definition Expr.h:427