@@ -47,6 +47,8 @@ struct OrtVitisAIEpAPI {
4747 void (*initialize_onnxruntime_vitisai_ep)(vaip_core::OrtApiForVaip* api, std::vector<OrtCustomOpDomain*>& ret_domain);
4848 std::vector<std::unique_ptr<vaip_core::ExecutionProvider>>* (*compile_onnx_model_with_options)(
4949 const std::string& model_path, const onnxruntime::Graph& graph, const onnxruntime::ProviderOptions& options);
50+ std::vector<std::unique_ptr<vaip_core::ExecutionProvider>>* (*compile_onnx_model_vitisai_ep_with_error_handling)(
51+ const std::string& model_path, const onnxruntime::Graph& graph, const onnxruntime::ProviderOptions& options, void * status, vaip_core::error_report_func func);
5052 uint32_t (*vaip_get_version)();
5153 void (*create_ep_context_nodes)(
5254 const std::vector<std::unique_ptr<vaip_core::ExecutionProvider>>& eps,
@@ -77,10 +79,11 @@ struct OrtVitisAIEpAPI {
7779 ORT_THROW_IF_ERROR (env.LoadDynamicLibrary (full_path, true , &handle_));
7880#endif
7981 ORT_THROW_IF_ERROR (env.GetSymbolFromLibrary (handle_, " initialize_onnxruntime_vitisai_ep" , (void **)&initialize_onnxruntime_vitisai_ep));
80- auto status = env.GetSymbolFromLibrary (handle_, " compile_onnx_model_vitisai_ep_with_options" , (void **)&compile_onnx_model_with_options);
81- if (!status.IsOK ()) {
82- ::onnxruntime::LogRuntimeError (0 , status, __FILE__, static_cast <const char *>(__FUNCTION__), __LINE__);
83- ORT_THROW (status);
82+ auto status1 = env.GetSymbolFromLibrary (handle_, " compile_onnx_model_vitisai_ep_with_error_handling" , (void **)&compile_onnx_model_vitisai_ep_with_error_handling);
83+ auto status2 = env.GetSymbolFromLibrary (handle_, " compile_onnx_model_vitisai_ep_with_options" , (void **)&compile_onnx_model_with_options);
84+ if ((!status1.IsOK ()) && (!status2.IsOK ())) {
85+ ::onnxruntime::LogRuntimeError (0 , status2, __FILE__, static_cast <const char *>(__FUNCTION__), __LINE__);
86+ ORT_THROW (status2);
8487 }
8588 std::ignore = env.GetSymbolFromLibrary (handle_, " vaip_get_version" ,
8689 (void **)&vaip_get_version);
@@ -89,6 +92,14 @@ struct OrtVitisAIEpAPI {
8992 ORT_THROW_IF_ERROR (env.GetSymbolFromLibrary (handle_, " vitisai_ep_on_run_start" , (void **)&vitisai_ep_on_run_start));
9093 ORT_THROW_IF_ERROR (env.GetSymbolFromLibrary (handle_, " vitisai_ep_set_ep_dynamic_options" , (void **)&vitisai_ep_set_ep_dynamic_options));
9194 }
95+ void Clear () {
96+ if (handle_) {
97+ auto & env = Provider_GetHost ()->Env__Default ();
98+ auto status = env.UnloadDynamicLibrary (handle_);
99+ vai_assert (status.IsOK (), status.ErrorMessage ());
100+ handle_ = nullptr ;
101+ }
102+ }
92103
93104 private:
94105 void * handle_{};
@@ -109,10 +120,25 @@ void profiler_collect(
109120 }
110121}
111122
123+ void change_status_with_error (void * status_ptr, int error_code, const char * error_msg) {
124+ auto status = reinterpret_cast <Status*>(status_ptr);
125+ *status = Status (onnxruntime::common::ONNXRUNTIME, error_code, error_msg);
126+ }
127+
112128vaip_core::DllSafe<std::vector<std::unique_ptr<vaip_core::ExecutionProvider>>> compile_onnx_model (
113- const onnxruntime::GraphViewer& graph_viewer, const logging::Logger& logger, const ProviderOptions& options) {
129+ const onnxruntime::GraphViewer& graph_viewer, const onnxruntime:: logging::Logger& logger, const onnxruntime:: ProviderOptions& options) {
114130 auto model_path = graph_viewer.ModelPath ().string ();
115- return vaip_core::DllSafe (s_library_vitisaiep.compile_onnx_model_with_options (model_path, graph_viewer.GetGraph (), options));
131+ if (s_library_vitisaiep.compile_onnx_model_vitisai_ep_with_error_handling ) {
132+ Status status = Status::OK ();
133+ auto status_ptr = reinterpret_cast <void *>(&status);
134+ auto ret = vaip_core::DllSafe (s_library_vitisaiep.compile_onnx_model_vitisai_ep_with_error_handling (model_path, graph_viewer.GetGraph (), options, status_ptr, change_status_with_error));
135+ if (!status.IsOK ()) {
136+ ORT_THROW (status);
137+ }
138+ return ret;
139+ } else {
140+ return vaip_core::DllSafe (s_library_vitisaiep.compile_onnx_model_with_options (model_path, graph_viewer.GetGraph (), options));
141+ }
116142}
117143
118144std::optional<std::vector<Node*>> create_ep_context_nodes (
@@ -396,10 +422,12 @@ vaip_core::OrtApiForVaip* create_org_api_hook() {
396422 the_global_api.tensor_proto_get_shape_unsafe = vaip::tensor_proto_get_shape;
397423 the_global_api.tensor_proto_data_type = [](const ONNX_NAMESPACE::TensorProto& t) -> int { return t.data_type (); };
398424 the_global_api.tensor_proto_delete = [](ONNX_NAMESPACE::TensorProto* tp) { delete tp; };
425+ the_global_api.tensor_proto_new_i4 = vaip::tensor_proto_new_i4;
399426 the_global_api.tensor_proto_new_i8 = vaip::tensor_proto_new_i8;
400427 the_global_api.tensor_proto_new_i16 = vaip::tensor_proto_new_i16;
401428 the_global_api.tensor_proto_new_i32 = vaip::tensor_proto_new_i32;
402429 the_global_api.tensor_proto_new_i64 = vaip::tensor_proto_new_i64;
430+ the_global_api.tensor_proto_new_u4 = vaip::tensor_proto_new_u4;
403431 the_global_api.tensor_proto_new_u8 = vaip::tensor_proto_new_u8;
404432 the_global_api.tensor_proto_new_u16 = vaip::tensor_proto_new_u16;
405433 the_global_api.tensor_proto_new_u32 = vaip::tensor_proto_new_u32;
@@ -468,9 +496,21 @@ vaip_core::OrtApiForVaip* create_org_api_hook() {
468496 return vaip_core::DllSafe<std::string>(std::move (local_str));
469497 };
470498
499+ the_global_api.is_profiling_enabled = [](void * session_options) {
500+ auto options = reinterpret_cast <OrtSessionOptions*>(session_options);
501+ return options->GetEnableProfiling ();
502+ };
503+ the_global_api.graph_remove_initialized_tensor = [](Graph& graph, const std::string& tensor_name) {
504+ graph.RemoveInitializedTensor (tensor_name);
505+ };
471506 if (!s_library_vitisaiep.vaip_get_version ) {
472507 return reinterpret_cast <vaip_core::OrtApiForVaip*>(&(the_global_api.host_ ));
473508 } else {
474509 return &the_global_api;
475510 }
476511}
512+
513+ void deinitialize_vitisai_ep () {
514+ s_library_vitisaiep.Clear ();
515+ s_kernel_registry_vitisaiep.reset ();
516+ }
0 commit comments