自动量化实现常用函数和类#
参考:tvm/src/relay/quantize/realize.cc
%cd ..
import testing
/media/pc/data/lxw/ai/tvm-book/doc/read/relay
QRealizeExprNode & QRealizeExpr#
class QRealizeExprNode : public TempExprNode {
public:
Expr data;
static constexpr const char* _type_key = "relay.quantize.QRealizeExpr";
TVM_DECLARE_BASE_OBJECT_INFO(QRealizeExprNode, TempExprNode);
};
class QRealizeExpr : public TempExpr {
public:
TVM_DEFINE_OBJECT_REF_METHODS(QRealizeExpr, TempExpr, QRealizeExprNode);
};
这是两个C++类的定义,它们分别表示量化表达式节点和量化表达式。
QRealizeExprNode
类继承自TempExprNode
类,表示一个量化表达式节点。它包含一个Expr
类型的成员变量data
,用于存储量化表达式的数据。同时,它还定义了一个静态常量字符串_type_key
,用于表示该类的类型信息。此外,它还使用了TVM_DECLARE_BASE_OBJECT_INFO
宏来声明基类对象的信息。QRealizeExpr
类继承自TempExpr
类,表示一个量化表达式。它使用了TVM_DEFINE_OBJECT_REF_METHODS
宏来定义对象引用方法,该方法将QRealizeExpr
类与QRealizeExprNode
类关联起来。这样,可以通过QRealizeExpr
对象间接访问和操作QRealizeExprNode
对象。
QRealizeIntExprNode & QRealizeIntExpr#
class QRealizeIntExprNode : public QRealizeExprNode {
public:
Expr dom_scale;
DataType dtype;
void VisitAttrs(tvm::AttrVisitor* v) {
v->Visit("data", &data);
v->Visit("dom_scale", &dom_scale);
v->Visit("dtype", &dtype);
}
Expr Realize() const final;
static constexpr const char* _type_key = "relay.quantize.QRealizeIntExpr";
TVM_DECLARE_FINAL_OBJECT_INFO(QRealizeIntExprNode, QRealizeExprNode);
};
class QRealizeIntExpr : public QRealizeExpr {
public:
TVM_DLL QRealizeIntExpr(Expr data, Expr dom_scale, DataType dtype);
TVM_DEFINE_OBJECT_REF_METHODS(QRealizeIntExpr, QRealizeExpr, QRealizeIntExprNode);
};
这是两个C++类的定义,它们分别表示量化整数表达式节点和量化整数表达式。
QRealizeIntExprNode
类继承自QRealizeExprNode
类,表示一个量化整数表达式节点。它包含三个成员变量:dom_scale
、dtype
和data
,分别用于存储量化整数表达式的域缩放因子、数据类型和数据。同时,它还定义了一个静态常量字符串_type_key
,用于表示该类的类型信息。此外,它还使用了TVM_DECLARE_FINAL_OBJECT_INFO
宏来声明基类对象的信息。QRealizeIntExpr
类继承自QRealizeExpr
类,表示一个量化整数表达式。它使用了TVM_DLL
宏来声明类的导出方式,并使用TVM_DEFINE_OBJECT_REF_METHODS
宏来定义对象引用方法,该方法将QRealizeIntExpr
类与QRealizeIntExprNode
类关联起来。这样,可以通过QRealizeIntExpr
对象间接访问和操作QRealizeIntExprNode
对象。
QRealizeIntExprNode::Realize
& QRealizeIntExpr::QRealizeIntExpr
#
Expr QRealizeIntExprNode::Realize() const {
Expr data = this->data;
// dequantize
data = Cast(data, DataType::Float(32));
data = Multiply(data, this->dom_scale);
return data;
}
QRealizeIntExpr::QRealizeIntExpr(Expr data, Expr dom_scale, DataType dtype) {
ObjectPtr<QRealizeIntExprNode> n = make_object<QRealizeIntExprNode>();
n->data = std::move(data);
n->dom_scale = std::move(dom_scale);
n->dtype = std::move(dtype);
data_ = std::move(n);
}
这是两个C++函数的定义,它们分别表示量化整数表达式节点的实现和量化整数表达式的构造函数。
QRealizeIntExprNode::Realize()
函数是量化整数表达式节点的实现函数,它首先将数据类型转换为浮点数,然后将数据乘以域缩放因子,最后返回结果。QRealizeIntExpr::QRealizeIntExpr()
函数是量化整数表达式的构造函数,它创建一个QRealizeIntExprNode
对象,并将传入的数据、域缩放因子和数据类型赋值给该对象的成员变量,最后将该对象赋值给data_
成员变量。
自动量化 ForwardOp#
inline Expr ForwardOp(const Call& ref_call, const Array<Expr>& args) {
return Call(ref_call->op, args, ref_call->attrs, ref_call->type_args);
}
这是一个C++函数,名为ForwardOp
,它接受两个参数:类型为 Call
的常量引用 ref_call
和类型为 Array<Expr>
的常量引用 args
。函数的返回类型是 Expr
。
函数的主要作用是将ref_call
中的算子、属性和类型参数传递给新的 Call
对象,并将 args
作为新对象的参数。最后,返回这个新的 Call
对象。