Halide 19.0.0
Halide compiler and libraries
|
A reference-counted handle to Halide's internal representation of a function. More...
#include <Function.h>
Classes | |
struct | Compare |
This lets you use a Function as a key in a map of the form map<Function, Foo, Function::Compare> More... | |
Public Member Functions | |
Function ()=default | |
Construct a new function with no definitions and no name. | |
Function (const std::string &n) | |
Construct a new function with the given name. | |
Function (const std::vector< Type > &required_types, int required_dims, const std::string &n) | |
Construct a new function with the given name, with a requirement that it can only represent Expr(s) of the given type(s), and must have exactly the give nnumber of dimensions. | |
Function (const FunctionPtr &) | |
Construct a Function from an existing FunctionContents pointer. | |
void | update_with_deserialization (const std::string &name, const std::string &origin_name, const std::vector< Halide::Type > &output_types, const std::vector< Halide::Type > &required_types, int required_dims, const std::vector< std::string > &args, const FuncSchedule &func_schedule, const Definition &init_def, const std::vector< Definition > &updates, const std::string &debug_file, const std::vector< Parameter > &output_buffers, const std::vector< ExternFuncArgument > &extern_arguments, const std::string &extern_function_name, NameMangling name_mangling, DeviceAPI device_api, const Expr &extern_proxy_expr, bool trace_loads, bool trace_stores, bool trace_realizations, const std::vector< std::string > &trace_tags, bool no_profiling, bool frozen) |
Update a function with deserialized data. | |
FunctionPtr | get_contents () const |
Get a handle on the halide function contents that this Function represents. | |
void | deep_copy (const FunctionPtr ©, std::map< FunctionPtr, FunctionPtr > &copied_map) const |
Deep copy this Function into 'copy'. | |
void | deep_copy (std::string name, const FunctionPtr ©, std::map< FunctionPtr, FunctionPtr > &copied_map) const |
void | define (const std::vector< std::string > &args, std::vector< Expr > values) |
Add a pure definition to this function. | |
void | define_update (const std::vector< Expr > &args, std::vector< Expr > values, const ReductionDomain &rdom=ReductionDomain{}) |
Add an update definition to this function. | |
void | accept (IRVisitor *visitor) const |
Accept a visitor to visit all of the definitions and arguments of this function. | |
void | mutate (IRMutator *mutator) |
Accept a mutator to mutator all of the definitions and arguments of this function. | |
const std::string & | name () const |
Get the name of the function. | |
const std::string & | origin_name () const |
If this is a wrapper of another func, created by a chain of in or clone_in calls, returns the name of the original Func. | |
Definition & | definition () |
Get a mutable handle to the init definition. | |
const Definition & | definition () const |
Get the init definition. | |
const std::vector< std::string > & | args () const |
Get the pure arguments. | |
int | dimensions () const |
Get the dimensionality. | |
int | outputs () const |
Get the number of outputs. | |
const std::vector< Type > & | output_types () const |
Get the types of the outputs. | |
const std::vector< Type > & | required_types () const |
Get the type constaints on the outputs (if any). | |
int | required_dimensions () const |
Get the dimensionality constaints on the outputs (if any). | |
const std::vector< Expr > & | values () const |
Get the right-hand-side of the pure definition. | |
bool | has_pure_definition () const |
Does this function have a pure definition? | |
bool | is_pure () const |
Does this function only have a pure definition? | |
bool | can_be_inlined () const |
Is it legal to inline this function? | |
FuncSchedule & | schedule () |
Get a handle to the function-specific schedule for the purpose of modifying it. | |
const FuncSchedule & | schedule () const |
Get a const handle to the function-specific schedule for inspecting it. | |
const std::vector< Parameter > & | output_buffers () const |
Get a handle on the output buffer used for setting constraints on it. | |
StageSchedule & | update_schedule (int idx=0) |
Get a mutable handle to the stage-specfic schedule for the update stage. | |
Definition & | update (int idx=0) |
Get a mutable handle to this function's update definition at index 'idx'. | |
const Definition & | update (int idx=0) const |
Get a const reference to this function's update definition at index 'idx'. | |
const std::vector< Definition > & | updates () const |
Get a const reference to this function's update definitions. | |
bool | has_update_definition () const |
Does this function have an update definition? | |
bool | has_extern_definition () const |
Check if the function has an extern definition. | |
NameMangling | extern_definition_name_mangling () const |
Get the name mangling specified for the extern definition. | |
Expr | make_call_to_extern_definition (const std::vector< Expr > &args, const Target &t) const |
Make a call node to the extern definition. | |
Expr | extern_definition_proxy_expr () const |
Get the proxy Expr for the extern stage. | |
Expr & | extern_definition_proxy_expr () |
void | define_extern (const std::string &function_name, const std::vector< ExternFuncArgument > &args, const std::vector< Type > &types, const std::vector< Var > &dims, NameMangling mangling, DeviceAPI device_api) |
Add an external definition of this Func. | |
const std::vector< ExternFuncArgument > & | extern_arguments () const |
Retrive the arguments of the extern definition. | |
std::vector< ExternFuncArgument > & | extern_arguments () |
const std::string & | extern_function_name () const |
Get the name of the extern function called for an extern definition. | |
DeviceAPI | extern_function_device_api () const |
Get the DeviceAPI declared for an extern function. | |
bool | same_as (const Function &other) const |
Test for equality of identity. | |
const std::string & | debug_file () const |
Get a const handle to the debug filename. | |
std::string & | debug_file () |
Get a handle to the debug filename. | |
operator ExternFuncArgument () const | |
Use an an extern argument to another function. | |
void | trace_loads () |
Tracing calls and accessors, passed down from the Func equivalents. | |
void | trace_stores () |
void | trace_realizations () |
void | add_trace_tag (const std::string &trace_tag) |
bool | is_tracing_loads () const |
bool | is_tracing_stores () const |
bool | is_tracing_realizations () const |
const std::vector< std::string > & | get_trace_tags () const |
void | lock_loop_levels () |
Replace this Function's LoopLevels with locked copies that cannot be mutated further. | |
void | do_not_profile () |
Mark the function as too small for meaningful profiling. | |
bool | should_not_profile () const |
Check if the function is marked as one that should not be profiled. | |
void | freeze () |
Mark function as frozen, which means it cannot accept new definitions. | |
bool | frozen () const |
Check if a function has been frozen. | |
Function | new_function_in_same_group (const std::string &) |
Make a new Function with the same lifetime as this one, and return a strong reference to it. | |
void | add_wrapper (const std::string &f, Function &wrapper) |
Mark calls of this function by 'f' to be replaced with its wrapper during the lowering stage. | |
const std::map< std::string, FunctionPtr > & | wrappers () const |
const Call * | is_wrapper () const |
Check if a Function is a trivial wrapper around another Function, Buffer, or Parameter. | |
Function & | substitute_calls (const std::map< FunctionPtr, FunctionPtr > &substitutions) |
Replace every call to Functions in 'substitutions' keys by all Exprs referenced in this Function to call to their substitute Functions (i.e. | |
Function & | substitute_calls (const Function &orig, const Function &substitute) |
bool | is_pure_arg (const std::string &name) const |
Return true iff the name matches one of the Function's pure args. | |
void | check_types (const Expr &e) const |
If the Function has type requirements, check that the given argument is compatible with them. | |
void | check_types (const Tuple &t) const |
void | check_types (const Type &t) const |
void | check_types (const std::vector< Expr > &exprs) const |
void | check_types (const std::vector< Type > &types) const |
void | check_dims (int dims) const |
If the Function has dimension requirements, check that the given argument is compatible with them. | |
void | create_output_buffers (const std::vector< Type > &types, int dims) const |
Define the output buffers. | |
A reference-counted handle to Halide's internal representation of a function.
Similar to a front-end Func object, but with no syntactic sugar to help with definitions.
Definition at line 39 of file Function.h.
|
default |
Construct a new function with no definitions and no name.
This constructor only exists so that you can make vectors of functions, etc.
|
explicit |
Construct a new function with the given name.
|
explicit |
Construct a new function with the given name, with a requirement that it can only represent Expr(s) of the given type(s), and must have exactly the give nnumber of dimensions.
required_types.empty() means there are no constraints on the type(s). required_dims == AnyDims means there are no constraints on the dimensions.
|
explicit |
Construct a Function from an existing FunctionContents pointer.
Must be non-null
void Halide::Internal::Function::update_with_deserialization | ( | const std::string & | name, |
const std::string & | origin_name, | ||
const std::vector< Halide::Type > & | output_types, | ||
const std::vector< Halide::Type > & | required_types, | ||
int | required_dims, | ||
const std::vector< std::string > & | args, | ||
const FuncSchedule & | func_schedule, | ||
const Definition & | init_def, | ||
const std::vector< Definition > & | updates, | ||
const std::string & | debug_file, | ||
const std::vector< Parameter > & | output_buffers, | ||
const std::vector< ExternFuncArgument > & | extern_arguments, | ||
const std::string & | extern_function_name, | ||
NameMangling | name_mangling, | ||
DeviceAPI | device_api, | ||
const Expr & | extern_proxy_expr, | ||
bool | trace_loads, | ||
bool | trace_stores, | ||
bool | trace_realizations, | ||
const std::vector< std::string > & | trace_tags, | ||
bool | no_profiling, | ||
bool | frozen ) |
Update a function with deserialized data.
|
inline |
Get a handle on the halide function contents that this Function represents.
Definition at line 97 of file Function.h.
void Halide::Internal::Function::deep_copy | ( | const FunctionPtr & | copy, |
std::map< FunctionPtr, FunctionPtr > & | copied_map ) const |
Deep copy this Function into 'copy'.
It recursively deep copies all called functions, schedules, update definitions, extern func arguments, specializations, and reduction domains. This method does not deep-copy the Parameter objects. This method also takes a map of <old Function, deep-copied version> as input and would use the deep-copied Function from the map if exists instead of creating a new deep-copy to avoid creating deep-copies of the same Function multiple times. If 'name' is specified, copy's name will be set to that.
void Halide::Internal::Function::deep_copy | ( | std::string | name, |
const FunctionPtr & | copy, | ||
std::map< FunctionPtr, FunctionPtr > & | copied_map ) const |
void Halide::Internal::Function::define | ( | const std::vector< std::string > & | args, |
std::vector< Expr > | values ) |
Add a pure definition to this function.
It may not already have a definition. All the free variables in 'value' must appear in the args list. 'value' must not depend on any reduction domain
void Halide::Internal::Function::define_update | ( | const std::vector< Expr > & | args, |
std::vector< Expr > | values, | ||
const ReductionDomain & | rdom = ReductionDomain{} ) |
Add an update definition to this function.
It must already have a pure definition but not an update definition, and the length of args must match the length of args used in the pure definition. 'value' may depend on some reduction domain may contain variables from that domain as well as pure variables. A reduction domain may also be introduced by passing it as the last argument. Any pure variables must also appear as Variables in the args array, and they must have the same name as the pure definition's argument in the same index.
void Halide::Internal::Function::accept | ( | IRVisitor * | visitor | ) | const |
Accept a visitor to visit all of the definitions and arguments of this function.
void Halide::Internal::Function::mutate | ( | IRMutator * | mutator | ) |
Accept a mutator to mutator all of the definitions and arguments of this function.
Referenced by Halide::SimdOpCheckTest::check_one().
const std::string & Halide::Internal::Function::name | ( | ) | const |
Get the name of the function.
Referenced by Halide::Internal::Autoscheduler::LoopNestParser::is_in_partial_schedule().
const std::string & Halide::Internal::Function::origin_name | ( | ) | const |
If this is a wrapper of another func, created by a chain of in or clone_in calls, returns the name of the original Func.
Otherwise returns the name.
Definition & Halide::Internal::Function::definition | ( | ) |
Get a mutable handle to the init definition.
const Definition & Halide::Internal::Function::definition | ( | ) | const |
Get the init definition.
const std::vector< std::string > & Halide::Internal::Function::args | ( | ) | const |
Get the pure arguments.
Referenced by Halide::Stage::Stage().
int Halide::Internal::Function::dimensions | ( | ) | const |
Get the dimensionality.
int Halide::Internal::Function::outputs | ( | ) | const |
Get the number of outputs.
const std::vector< Type > & Halide::Internal::Function::output_types | ( | ) | const |
Get the types of the outputs.
const std::vector< Type > & Halide::Internal::Function::required_types | ( | ) | const |
Get the type constaints on the outputs (if any).
int Halide::Internal::Function::required_dimensions | ( | ) | const |
Get the dimensionality constaints on the outputs (if any).
const std::vector< Expr > & Halide::Internal::Function::values | ( | ) | const |
Get the right-hand-side of the pure definition.
Returns an empty vector if there is no pure definition.
Warning: Any Vars in the Exprs are not qualified with the Func name, so the Exprs may contain names which collide with names provided by unique_name.
bool Halide::Internal::Function::has_pure_definition | ( | ) | const |
Does this function have a pure definition?
Referenced by is_pure().
|
inline |
Does this function only have a pure definition?
Definition at line 184 of file Function.h.
References has_extern_definition(), has_pure_definition(), and has_update_definition().
bool Halide::Internal::Function::can_be_inlined | ( | ) | const |
Is it legal to inline this function?
FuncSchedule & Halide::Internal::Function::schedule | ( | ) |
Get a handle to the function-specific schedule for the purpose of modifying it.
const FuncSchedule & Halide::Internal::Function::schedule | ( | ) | const |
Get a const handle to the function-specific schedule for inspecting it.
const std::vector< Parameter > & Halide::Internal::Function::output_buffers | ( | ) | const |
Get a handle on the output buffer used for setting constraints on it.
StageSchedule & Halide::Internal::Function::update_schedule | ( | int | idx = 0 | ) |
Get a mutable handle to the stage-specfic schedule for the update stage.
Definition & Halide::Internal::Function::update | ( | int | idx = 0 | ) |
Get a mutable handle to this function's update definition at index 'idx'.
Referenced by Halide::SimdOpCheckTest::check_one().
const Definition & Halide::Internal::Function::update | ( | int | idx = 0 | ) | const |
Get a const reference to this function's update definition at index 'idx'.
const std::vector< Definition > & Halide::Internal::Function::updates | ( | ) | const |
Get a const reference to this function's update definitions.
bool Halide::Internal::Function::has_update_definition | ( | ) | const |
Does this function have an update definition?
Referenced by Halide::SimdOpCheckTest::check_one(), and is_pure().
bool Halide::Internal::Function::has_extern_definition | ( | ) | const |
Check if the function has an extern definition.
Referenced by is_pure().
NameMangling Halide::Internal::Function::extern_definition_name_mangling | ( | ) | const |
Get the name mangling specified for the extern definition.
Expr Halide::Internal::Function::make_call_to_extern_definition | ( | const std::vector< Expr > & | args, |
const Target & | t ) const |
Make a call node to the extern definition.
An error if the function has no extern definition.
Expr Halide::Internal::Function::extern_definition_proxy_expr | ( | ) | const |
Get the proxy Expr for the extern stage.
This is an expression known to have the same data access pattern as the extern stage. It must touch at least all of the memory that the extern stage does, though it is permissible for it to be conservative and touch a superset. For most Functions, including those with extern definitions, this will be an undefined Expr.
Expr & Halide::Internal::Function::extern_definition_proxy_expr | ( | ) |
void Halide::Internal::Function::define_extern | ( | const std::string & | function_name, |
const std::vector< ExternFuncArgument > & | args, | ||
const std::vector< Type > & | types, | ||
const std::vector< Var > & | dims, | ||
NameMangling | mangling, | ||
DeviceAPI | device_api ) |
const std::vector< ExternFuncArgument > & Halide::Internal::Function::extern_arguments | ( | ) | const |
Retrive the arguments of the extern definition.
std::vector< ExternFuncArgument > & Halide::Internal::Function::extern_arguments | ( | ) |
const std::string & Halide::Internal::Function::extern_function_name | ( | ) | const |
Get the name of the extern function called for an extern definition.
DeviceAPI Halide::Internal::Function::extern_function_device_api | ( | ) | const |
Get the DeviceAPI declared for an extern function.
|
inline |
Test for equality of identity.
Definition at line 265 of file Function.h.
References Halide::Internal::FunctionPtr::same_as().
const std::string & Halide::Internal::Function::debug_file | ( | ) | const |
Get a const handle to the debug filename.
std::string & Halide::Internal::Function::debug_file | ( | ) |
Get a handle to the debug filename.
Halide::Internal::Function::operator ExternFuncArgument | ( | ) | const |
Use an an extern argument to another function.
void Halide::Internal::Function::trace_loads | ( | ) |
Tracing calls and accessors, passed down from the Func equivalents.
void Halide::Internal::Function::trace_stores | ( | ) |
void Halide::Internal::Function::trace_realizations | ( | ) |
void Halide::Internal::Function::add_trace_tag | ( | const std::string & | trace_tag | ) |
bool Halide::Internal::Function::is_tracing_loads | ( | ) | const |
bool Halide::Internal::Function::is_tracing_stores | ( | ) | const |
bool Halide::Internal::Function::is_tracing_realizations | ( | ) | const |
const std::vector< std::string > & Halide::Internal::Function::get_trace_tags | ( | ) | const |
void Halide::Internal::Function::lock_loop_levels | ( | ) |
Replace this Function's LoopLevels with locked copies that cannot be mutated further.
void Halide::Internal::Function::do_not_profile | ( | ) |
Mark the function as too small for meaningful profiling.
bool Halide::Internal::Function::should_not_profile | ( | ) | const |
Check if the function is marked as one that should not be profiled.
void Halide::Internal::Function::freeze | ( | ) |
Mark function as frozen, which means it cannot accept new definitions.
bool Halide::Internal::Function::frozen | ( | ) | const |
Check if a function has been frozen.
If so, it is an error to add new definitions.
Function Halide::Internal::Function::new_function_in_same_group | ( | const std::string & | ) |
void Halide::Internal::Function::add_wrapper | ( | const std::string & | f, |
Function & | wrapper ) |
Mark calls of this function by 'f' to be replaced with its wrapper during the lowering stage.
If the string 'f' is empty, it means replace all calls to this function by all other functions (excluding itself) in the pipeline with the wrapper. This will also freeze 'wrapper' to prevent user from updating the values of the Function it wraps via the wrapper. See Func::in for more details.
const std::map< std::string, FunctionPtr > & Halide::Internal::Function::wrappers | ( | ) | const |
const Call * Halide::Internal::Function::is_wrapper | ( | ) | const |
Function & Halide::Internal::Function::substitute_calls | ( | const std::map< FunctionPtr, FunctionPtr > & | substitutions | ) |
Replace every call to Functions in 'substitutions' keys by all Exprs referenced in this Function to call to their substitute Functions (i.e.
the corresponding values in 'substitutions' map).
Function & Halide::Internal::Function::substitute_calls | ( | const Function & | orig, |
const Function & | substitute ) |
bool Halide::Internal::Function::is_pure_arg | ( | const std::string & | name | ) | const |
Return true iff the name matches one of the Function's pure args.
void Halide::Internal::Function::check_types | ( | const Expr & | e | ) | const |
If the Function has type requirements, check that the given argument is compatible with them.
If not, assert-fail. (If there are no type requirements, do nothing.)
void Halide::Internal::Function::check_types | ( | const Tuple & | t | ) | const |
void Halide::Internal::Function::check_types | ( | const Type & | t | ) | const |
void Halide::Internal::Function::check_types | ( | const std::vector< Expr > & | exprs | ) | const |
void Halide::Internal::Function::check_types | ( | const std::vector< Type > & | types | ) | const |
void Halide::Internal::Function::check_dims | ( | int | dims | ) | const |
If the Function has dimension requirements, check that the given argument is compatible with them.
If not, assert-fail. (If there are no dimension requirements, do nothing.)
void Halide::Internal::Function::create_output_buffers | ( | const std::vector< Type > & | types, |
int | dims ) const |