1. 程式人生 > 其它 >ONNXRuntime原始碼閱讀(一)

ONNXRuntime原始碼閱讀(一)

在構建一個推理模型時(如NanoDet,一個目標檢測模型),需要繼承 BasicOrtHandler。BasicOrtHandler 的初始化函式中會呼叫 initialize_handler() 方法,該方法會對 Ort::Env ort_env(構建在棧上)、Ort::Session ort_session(構建在堆上)等屬性進行初始化。接著深入到 Ort::Env 中,該類就定義在檔案 onnxruntime/onnxruntime/core/session/onnxruntime_cxx_api.h 中,值得注意的是在這個檔案中存在一個很重要的模板類 Base

template <typename T>
struct Base {
  using contained_type = T;

  Base() = default;
  Base(T* p) : p_{p} {
    if (!p)
      ORT_CXX_API_THROW("Allocation failure", ORT_FAIL);
  }
  ~Base() { OrtRelease(p_); }

  operator T*() { return p_; }
  operator const T*() const { return p_; }

  /// \brief Releases ownership of the contained pointer
  T* release() {
    T* p = p_;
    p_ = nullptr;
    return p;
  }

 protected:
  Base(const Base&) = delete;  // 拷貝構造:刪除
  Base& operator=(const Base&) = delete;  // 拷貝賦值:刪除
  Base(Base&& v) noexcept : p_{v.p_} { v.p_ = nullptr; }  // 支援移動構造
  void operator=(Base&& v) noexcept {
    OrtRelease(p_);
    p_ = v.release();
  }

  T* p_{};

  template <typename>
  friend struct Unowned;  // This friend line is needed to keep the centos C++ compiler from giving an error
};

可以看出,這裡實現了類似於 unique_ptr 的功能。在該檔案中,有許多類繼承被 Base 包裝後的基類,如 Env 繼承自 Base,SessionOptions 繼承自 Base,而 OrtEnv 和 OrtSessionOptions 都是在 onnxruntime_c_api.h 檔案中宣告的。以 OrtEnv 為例,該類的定義位於 onnxruntime/core/session/ort_env.h 中。