TNN源碼閱讀筆記(三)

tnn

TNN_NS::TNN是TNN對外暴露接口的管理類,如下使用

//api接口的管理對象
TNN_NS::TNN tnn;
//配置MODEL_TYPE_TNN和模型文件(tnnparam和tnnmodel文件)
TNN_NS::ModelConfig model_config;
//讀取tnnparam和tnnmodel文件
auto proto_tnn = fdLoadFile(model_param);
auto model_tnn = fdLoadFile(model);
model_config.model_type = TNN_NS::MODEL_TYPE_TNN;
model_config.params = {proto_tnn, model_tnn};
初始化
tnn.Init(model_config);

TNN這個類的主要目的是為了對外暴露接口,主要有四個成員函數,分別是Init、DeInit、AddOutput和CreateInst,先來看下include/tnn下的tnn.h,如下

class TNNImpl;

class PUBLIC TNN {
public:
    TNN();
    
    ~TNN();

    // 初始化函數,解析模型文件
    Status Init(ModelConfig& config);

    // 釋放模型解析器.
    Status DeInit();

    // 增加輸出節(jié)點,先通過output_name,如果沒有找到名字,就通過索引 查找節(jié)點.
    Status AddOutput(const std::string& output_name, int output_index = 0);

    // 用于創(chuàng)建網絡執(zhí)行器Instance
    std::shared_ptr<Instance> CreateInst(
        NetworkConfig& config, Status& status,
        InputShapesMap inputs_shape = InputShapesMap());

private:
    //要暴露接口的tnn內部類
    std::shared_ptr<TNNImpl> impl_ = nullptr;
};

由于這個類的目的是為了暴露接口,所以它的四個成員函數其實對應了TNNImpl中的四個函數,來看看source/tnn/core下的tnn.cc,

Status TNN::Init(ModelConfig& config) {
    //tnn內部需要暴露接口的類的實例對象
    impl_ = TNNImplManager::GetTNNImpl(config.model_type);
    if (!impl_) {
        LOGE("Error: not support mode type: %d\n", config.model_type);
        return Status(TNNERR_NET_ERR, "not support mode type");
    }
    //對應實例對象初始化函數,解析模型文件
    return impl_->Init(config);
}
//對應釋放模型解析器
Status TNN::DeInit() {
    impl_ = nullptr;
    return TNN_OK;
}

Status TNN::AddOutput(const std::string& layer_name, int output_index) {
    // todo for output index
    if (!impl_) {
        LOGE("Error: impl_ is nil\n");
        return Status(TNNERR_NET_ERR, "tnn impl_ is nil");
    }
    //對應增加輸出節(jié)點函數
    return impl_->AddOutput(layer_name, output_index);
}

std::shared_ptr<Instance> TNN::CreateInst(NetworkConfig& config, Status& status, InputShapesMap inputs_shape) {
    if (!impl_) {
        status = Status(TNNERR_NET_ERR, "tnn impl_ is nil");
        return nullptr;
    }
    //對應創(chuàng)建網絡執(zhí)行器Instance,返回Instance對象
    return impl_->CreateInst(config, status, inputs_shape);
}
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容