/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ /*! * \file tir/analysis/device_constraint_utils.cc * \brief Utilities for extracting and applying device-related constraints to \p PrimFunc * parameters. * * These utilities are used by the \p PlanDevices pass to extract memory (aka 'storage') scope * information from \p PrimFuncs and convert them back into \p VirtualDevice form w.r.t. the * original Relay type of the \p PrimFunc (ie before flattening of tuple arguments/results and * conversion to destination-passing style aka DPS). * * A utility is also supplied to go the other way: impose memory scopes on \p PrimFunc parameters. * However that's still in EXPERIMENTAL form. * * We may extend these utilities to also gather/apply layout information should we add that to * \p VirtualDevice. */ #ifndef TVM_TIR_ANALYSIS_DEVICE_CONSTRAINT_UTILS_H_ #define TVM_TIR_ANALYSIS_DEVICE_CONSTRAINT_UTILS_H_ #include #include namespace tvm { namespace tir { /*! * A Relay Function with type: * \code * fn((Tensor[...], Tensor[...]), Tensor[...]) -> (Tensor[...], Tensor[...]) * ^ ^ ^ ^ ^ * a b c d e * \endcode * will be represented by a TIR PrimFunc in flattened and DPS form with at least 5 argument a..e. * \code * primfn(a: handle, b: handle, c: handle, d: handle, e: handle) { * buffers = { ... } * buffer_map = { ... } * ... * } * \endcode * * Each such PrimFunc argument will me mapped to a \p Buffer who's underlying \p data \p Var * has a \p PointerType. * * The PrimFunc may have additional non-pointer arguments, eg for: * - scalar inputs and tensor dimensions * - device contexts * Those should be ignored here since they have no counterpart in the Relay Function. * * We'll need helpers to map on-the-fly between the Relay and TIR view of functions. */ /*! * \brief Returns the \p VirtualDevices capturing the memory (aka storage) scope constraints for all * the arguments and result of \p prim_func. However the result will be w.r.t. the \p prim_func's * representation as a Relay \p Function of \p relay_func_type_ before lowering and conversion to * DPS. */ Array GetPrimFuncArgAndResultConstraints(const tir::PrimFunc& prim_func, const FuncType& relay_func_type); /* * \brief Returns \p prim_func written to capture the memory (aka storage) scope constraints * for each of the \p prim_func's parameters given by \p arg_and_result_virtual_devices. However, * \p arg_and_result_virtual_devices should be w.r.t. the \p prim_func's representation as a Relay * \p Function of \p relay_func_type before lowering and conversion to DPS. * * CAUTION: This is experimental. The resulting \p PrimFunc may not have fully accounted for all * new memory scopes. */ PrimFunc ApplyPrimFuncArgAndResultConstraints( const PrimFunc& prim_func, const FuncType& relay_func_type, const Array& arg_and_result_virtual_devices); } // namespace tir } // namespace tvm #endif // TVM_TIR_ANALYSIS_DEVICE_CONSTRAINT_UTILS_H_