这篇文档将讲解和HalideIR相关的内容。
HalideIR是一个创建符号表达式和算术简化的基础模块。它从原始的Halide项目重构而来,用于TVM项目中。
HalideIR的代码基于Halide(release_2017_05_03),由四个部分组成:
base部分具体提供了哪些功能:
接下来着重讲解halide基础类型和实用工具这两个内容。
base部分将一系列类型表示为C++函数签名,这种形式拥有两个优点:
base部分还提供了一些实用函数
tvm部分比较重要的数据结构有:
// 代码节选
class EXPORT Node : public std::enable_shared_from_this<Node> {
public:
virtual const char* type_key() const = 0;
virtual void VisitAttrs(AttrVisitor* visitor) {}
}
/*! NOdeRef是所有节点引用对象的基类 */
class NodeRef {
using ContainerType = Node;
inline bool operator==(const NodeRef& other) const;
inline bool same_as(const NodeRef& other) const;
inline bool operator<(const NodeRef& other) const;
inline bool operator!=(const NodeRef& other) const;
inline uint32_t type_index() const;
inline const Node* operator->() const;
template<typename T>
inline const T *as() const;
NodeRef() = default;
explicit NodeRef(std::shared_ptr<Node> node) : node_(node) {}
std::shared_ptr<Node> node_;
}
tvm/HalideIR/ir/Expr.h
/** 一个处理statement node的引用计数的handle */
struct Stmt : public IRHandle {
Stmt() : IRHandle() {}
Stmt(std::shared_ptr<IR::Node> n) : IRHandle(n) {}
/** Dispatch to the correct visitor method for this node. E.g. if
* this node is actually an Add node, then this will call
* IRVisitor::visit(const Add *) */
inline void accept(Internal::IRVisitor *v) const {
static_cast<const Internal::BaseStmtNode *>(node_.get())->accept(v, *this);
}
/*! \brief type indicate the container type */
using ContainerType = Internal::BaseStmtNode;
};
IR.h里面存放了深度学习需要的IR基础节点
tvm/HalideIR/ir/IR.cpp