一、架構全景圖
二、源碼詳細解讀
1. Lite體系下似乎有多種 op_desc/program_desc
的定義,之間的關係是什麼?這樣設計的背景和好處是什麼?
- model_parser目錄下,包含
- flatbuffers——結構描述定義在
framework.fbs
文件中,命名空間爲paddle.lite.fbs.proto
- 它除了定義OpDesc,還定義了
OpDescView
(這個用來做什麼的?)
- 它除了定義OpDesc,還定義了
- naive_buffer——結構描述定義在
proto/framework.nb.h
中,其中Attr
爲繼承StructBuilder,內含一個map結構- BinaryTable、FieldBuider、PrimaryBuilder、PrimaryListBuilder、EnumBuilder、StringBuilder、ListBuilder
- pb——結構描述定義在
core/framework.pb.h
中,對應於主框架Paddle中的proto描述,二者爲同一個(似乎會延遲更新) - ssa——結構描述定義在
ssa/op_proto.h
,有別於前三個,這裏僅僅定義了BlockOpProto
- 從頭文件包含來看,是複用的
core/model/general/op_desc.h
的定義 - 個人覺得ssa是爲了轉graph,因此直接依賴genernal模塊的IR表示即可,無需額外定義新的結構描述
- 從頭文件包含來看,是複用的
- 注意:除了ssa以外,其他三個目錄下的IR表示都是繼承自core/model/base下的xxDescAPI
- cpp_desc定義:
- 通過一個宏來切換,LITE_ON_FLATBUFFERS_DESC_VIEW
- 若開啓了此宏,則cpp命名空間裏的Desc表示使用類似
fbs::ProgramDescView
- 若關閉了此宏,則cpp命名空間裏的Desc表示使用類似
general::ProgrMode
- 若開啓了此宏,則cpp命名空間裏的Desc表示使用類似
- 通過一個宏來切換,LITE_ON_FLATBUFFERS_DESC_VIEW
- flatbuffers——結構描述定義在
- core/model 目錄下,包含:
- base公共API:
- VarDesc相關:VarDescAPI多繼承自
VarDescReadAPI
和VarDescWriteAPI
,分別約定了可讀、可寫的接口虛函數 - OpDesc相關:OpDescAPI多繼承自
OpDescReadAPI
和OpDescWriteAPI
,分別約定了可讀、可寫的接口虛函數 - BlockDesc相關:BlockDescAPI多繼承自
BlockDescReadAPI
和BlockDescWriteAPI
,分別約定了可讀、可寫的接口虛函數 - ProgramDesc相關:ProgramDescAPI多繼承自
ProgramDescReadAPI
和ProgramDescWriteAPI
,分別約定了可讀、可寫的接口虛函數 - ParamDesc相關:ParamDescAPI多繼承自
ParamDescReadAPI
和ParamDescWriteAPI
,分別約定了可讀、可寫的接口虛函數- 這裏還有一個
CombinedParamDescAPI
,和上面類似,父類不一樣,多了ParamDesc的更新操作
- 這裏還有一個
- VarDesc相關:VarDescAPI多繼承自
- general目錄下,包含
- VarDesc類:繼承自VarDescAPI,不持有任何proto相關的成員,很簡潔地描述VarDesc信息
- OpDesc類:繼承自OpDescAPI,不持有任何proto相關的成員,很簡潔地描述OpDesc信息
- attrs_ 是
std::map<string, Any>
- attrs_ 是
- BlockDesc類:繼承自BlockDescAPI,不持有任何proto相關的成員,很簡潔地描述BlockDesc信息
- ProgramDesc類:繼承自ProgramDescAPI,不持有任何proto相關的成員,很簡潔地描述ProgramDesc信息
- base公共API:
core/mode/base/traits.h目錄下的OpDataTypeTrait似乎是與OpAttrType一一對應關係,不允許重複?
如下是OpAttrType的定義:
// The AttrType is used to make the proto::AttrType portable.
enum class OpAttrType {
INT = 0,
FLOAT = 1,
STRING = 2,
INTS = 3,
FLOATS = 4,
STRINGS = 5,
BOOLEAN = 6,
BOOLEANS = 7,
BLOCK = 8,
LONG = 9,
BLOCKS = 10,
LONGS = 11,
UNK,
};
如下是OpDataTypeTrait機制實現:
#define ATTR_TYPE_TRAIT_IMPL(T, type__) \
template <typename U> \
struct OpDataTypeTrait<type__, U> { \
typedef type__ ET; \
typedef type__ RT; \
static constexpr OpAttrType AT{OpAttrType::T}; \
static constexpr const char* ATN{#T}; \
}; \
template <typename U> \
constexpr OpAttrType OpDataTypeTrait<type__, U>::AT; \
template <typename U> \
constexpr const char* OpDataTypeTrait<type__, U>::ATN;
ATTR_TYPE_TRAIT_IMPL(BLOCK, int16_t);
ATTR_TYPE_TRAIT_IMPL(INT, int32_t);
ATTR_TYPE_TRAIT_IMPL(FLOAT, float);
ATTR_TYPE_TRAIT_IMPL(STRING, std::string);
ATTR_TYPE_TRAIT_IMPL(BOOLEAN, bool);
ATTR_TYPE_TRAIT_IMPL(LONG, int64_t);
// general/op_desc.h 中的接口調用:
template <typename T>
void SetAttr(const std::string& name, const T& v) {
attr_types_[name] = OpDataTypeTrait<T>::AT; // <----- 如T爲int16_t,則attr_type記錄爲BLOCK
attrs_[name].set(v);
}