Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
79 commits
Select commit Hold shift + click to select a range
8c03c61
Sketch API funcs
adrianlizarraga Sep 23, 2025
40d7866
Merge branch 'main' into adrianl/ep-abi-kernel-based-eps
adrianlizarraga Sep 26, 2025
ec46ea5
Implement more c apis
adrianlizarraga Sep 27, 2025
e8532a9
OpKernel class for plugin EPs
adrianlizarraga Sep 27, 2025
246681c
Initialize PluginExecutionProvider's kernel registry
adrianlizarraga Sep 28, 2025
6b61b91
Move files to session
adrianlizarraga Sep 28, 2025
4a112fc
Add API to set kernel def I/O memory types
adrianlizarraga Sep 28, 2025
0f870d0
Add C API to add type constraints to a kernel definition
adrianlizarraga Sep 28, 2025
9be6923
Start implementing MemcpyFromHost kernel in example EP
adrianlizarraga Sep 28, 2025
5df3fb5
Get kernel for MemcpyFromHost working for example plugin EP!
adrianlizarraga Sep 28, 2025
5aade60
Moved example plugin EP's kernel stuff to different file
adrianlizarraga Sep 28, 2025
d159b38
Add separate utility to load OrtMLDataTypes
adrianlizarraga Sep 29, 2025
8187233
Add MLDataTypes::GetTensorType()
adrianlizarraga Sep 29, 2025
bf92f04
Add C++ Ort::KernelDefBuilder to allow creation of macro
adrianlizarraga Sep 29, 2025
da14d65
Create macro for defining BuildKernelCreateInfo functions for each op
adrianlizarraga Sep 30, 2025
73ae307
Move kernels to separate directory/files
adrianlizarraga Sep 30, 2025
fb4a6a6
Use data transfer in MemcpyFromHost and MemcpyToHost
adrianlizarraga Sep 30, 2025
b8867d6
Release OrtKernelCreateInfo instances if an error occurs
adrianlizarraga Sep 30, 2025
de8be32
Move typedef and add forward-declaration of OrtKernelImpl for gcc
adrianlizarraga Sep 30, 2025
dc78ec3
Merge branch 'main' into adrianl/ep-abi-kernel-based-eps
adrianlizarraga Sep 30, 2025
8babb63
Apply suggestions from code review
adrianlizarraga Oct 1, 2025
90bf598
Simplify with OrtKernelRegistry
adrianlizarraga Oct 2, 2025
9f95589
Pass custom state to kernel creation in plugin EP
adrianlizarraga Oct 2, 2025
90e4fc1
Clean up
adrianlizarraga Oct 2, 2025
5f52cdc
ExampleEp: cache kernel registry in factory so it can be reused by al…
adrianlizarraga Oct 2, 2025
9bfc281
Add C API to lookup a kernel from within OrtEp::GetCapability
adrianlizarraga Oct 2, 2025
60ea06c
Disambiguate a compiled subgraph (of one node) from a registered kern…
adrianlizarraga Oct 2, 2025
33ffd8d
Add unit test for EpGraphSupportInfo_LookUpKernel()
adrianlizarraga Oct 2, 2025
31cdc82
Add missing include needed for linux ci
adrianlizarraga Oct 2, 2025
93b99e6
Add KernelDef to C++ api and add basic getters
adrianlizarraga Oct 2, 2025
995e25b
Add documentation comments
adrianlizarraga Oct 3, 2025
0f7145f
Remove incorrect comment
adrianlizarraga Oct 3, 2025
f528f6f
Add missing API_IMPL_BEGIN/END macro calls
adrianlizarraga Oct 6, 2025
9fbf230
Merge branch 'main' into adrianl/ep-abi-kernel-based-eps
adrianlizarraga Oct 6, 2025
92d82d8
Merge main and fix conflicts
adrianlizarraga Oct 31, 2025
48ebab3
Merge branch 'main' into adrianl/ep-abi-kernel-based-eps
adrianlizarraga Nov 3, 2025
1d92b90
Move static PluginExecutionProvider::Create to a method on the factor…
adrianlizarraga Nov 4, 2025
d6404dd
Fix null return value from calling the internal kernel lookup function
adrianlizarraga Nov 4, 2025
60ac6f2
Add assertion that file opened successfully
adrianlizarraga Nov 4, 2025
f48d6f8
Fix unused variables
adrianlizarraga Nov 4, 2025
5da69e8
Fix another unused variable
adrianlizarraga Nov 4, 2025
70b3434
Add new example EP that uses kernel registration
adrianlizarraga Nov 6, 2025
faf4260
lintrunner
adrianlizarraga Nov 6, 2025
3dfa500
Merge branch 'main' into adrianl/ep-abi-kernel-based-eps
adrianlizarraga Nov 6, 2025
692ec03
Remove memcpy kernels from example ep
adrianlizarraga Nov 6, 2025
38d433c
Fix android compiler error due to unused field
adrianlizarraga Nov 6, 2025
fd20c29
Fix gsl linking for non-windows
adrianlizarraga Nov 7, 2025
6aa4b50
Merge branch 'main' into adrianl/ep-abi-kernel-based-eps
adrianlizarraga Nov 7, 2025
198ab0d
Add unit test that uses kernel-based EP to run a model with Squeeze a…
adrianlizarraga Nov 7, 2025
ea91325
Copy new example ep .so to android test directory. Ensure unit tests …
adrianlizarraga Nov 7, 2025
dcb6e06
Mark OrtEp::Compile() and OrtEp::ReleaseNodeComputeInfos() as optiona…
adrianlizarraga Nov 7, 2025
caf1274
Add C++ Ort::KernelRegistry class
adrianlizarraga Nov 7, 2025
d2d8f61
Update include/onnxruntime/core/session/onnxruntime_cxx_api.h
adrianlizarraga Nov 7, 2025
5771cc2
Clean up kernel registration code on the EP side
adrianlizarraga Nov 7, 2025
a43d7d6
Clean up
adrianlizarraga Nov 7, 2025
5aa4f75
Add KernelBuilder aliasing API functions. Add a relu kernel to test it.
adrianlizarraga Nov 8, 2025
2ff711d
Edit test onnx model to properly test mutable alias (buffer reuse for…
adrianlizarraga Nov 8, 2025
d131945
Address review comments
adrianlizarraga Nov 8, 2025
9d37ff8
Forgot to change return Ort::Status{nullptr} to return nullptr
adrianlizarraga Nov 8, 2025
635b2b5
Merge branch 'main' into adrianl/ep-abi-kernel-based-eps
adrianlizarraga Nov 10, 2025
a0b5fdd
Address review comments
adrianlizarraga Nov 10, 2025
24bfd53
Update lib name for files copied to Android testing dir
adrianlizarraga Nov 10, 2025
b0a0b84
Rename DLL in .def file
adrianlizarraga Nov 11, 2025
874b54e
Address (great) review comments
adrianlizarraga Nov 11, 2025
099e8f3
Correct documentation regarding the meaning of -1 for the 'end_version'.
adrianlizarraga Nov 11, 2025
248c3a3
Don't include unnecessary initial struct vals
adrianlizarraga Nov 11, 2025
96f9f70
Split up parameters into two parallel arrays
adrianlizarraga Nov 12, 2025
250c7aa
Merge branch 'main' into adrianl/ep-abi-kernel-based-eps
adrianlizarraga Nov 12, 2025
7d5627b
Add checks and more unit tests for KernelDefBuilder_SetSinceVersion
adrianlizarraga Nov 13, 2025
bb1fa0d
Decide to remove unused FuncManager parameter from the kernel creatio…
adrianlizarraga Nov 14, 2025
7b2b6e0
Merge branch 'main' into adrianl/ep-abi-kernel-based-eps
adrianlizarraga Nov 30, 2025
0913a94
Address review comments: base kernel class, auto*, data_type utils no…
adrianlizarraga Dec 1, 2025
b28afb3
Complete approach B
adrianlizarraga Dec 1, 2025
d1ef6b0
Review comments
adrianlizarraga Dec 2, 2025
6ba335f
Remove noexcept from BaseKernel::DoCompute
adrianlizarraga Dec 2, 2025
945d31e
Review comments
adrianlizarraga Dec 3, 2025
9ebeace
Update onnxruntime/core/session/plugin_ep/ep_plugin_provider_interfac…
adrianlizarraga Dec 5, 2025
4b2f9f0
Update onnxruntime/test/autoep/library/example_plugin_ep_kernel_regis…
adrianlizarraga Dec 5, 2025
568c6c0
Review comments
adrianlizarraga Dec 5, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
46 changes: 45 additions & 1 deletion cmake/onnxruntime_unittests.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -2094,6 +2094,50 @@ if (onnxruntime_BUILD_SHARED_LIB AND
set_target_properties(example_plugin_ep_virt_gpu PROPERTIES FOLDER "ONNXRuntimeTest")
source_group(TREE ${TEST_SRC_DIR} FILES ${onnxruntime_autoep_test_example_plugin_ep_virt_gpu_src})

#
# example_plugin_ep_kernel_registry
#
set(onnxruntime_autoep_test_example_plugin_ep_kernel_registry_src
"${TEST_SRC_DIR}/autoep/library/plugin_ep_utils.h"
"${TEST_SRC_DIR}/autoep/library/example_plugin_ep_kernel_registry/ep_lib_entry.cc"
"${TEST_SRC_DIR}/autoep/library/example_plugin_ep_kernel_registry/ep_factory.h"
"${TEST_SRC_DIR}/autoep/library/example_plugin_ep_kernel_registry/ep_factory.cc"
"${TEST_SRC_DIR}/autoep/library/example_plugin_ep_kernel_registry/ep.h"
"${TEST_SRC_DIR}/autoep/library/example_plugin_ep_kernel_registry/ep.cc"
"${TEST_SRC_DIR}/autoep/library/example_plugin_ep_kernel_registry/ep_kernel_registration.h"
"${TEST_SRC_DIR}/autoep/library/example_plugin_ep_kernel_registry/ep_kernel_registration.cc"
"${TEST_SRC_DIR}/autoep/library/example_plugin_ep_kernel_registry/kernels/utils.h"
"${TEST_SRC_DIR}/autoep/library/example_plugin_ep_kernel_registry/kernels/base.h"
"${TEST_SRC_DIR}/autoep/library/example_plugin_ep_kernel_registry/kernels/base.cc"
"${TEST_SRC_DIR}/autoep/library/example_plugin_ep_kernel_registry/kernels/squeeze.h"
"${TEST_SRC_DIR}/autoep/library/example_plugin_ep_kernel_registry/kernels/squeeze.cc"
"${TEST_SRC_DIR}/autoep/library/example_plugin_ep_kernel_registry/kernels/relu.h"
"${TEST_SRC_DIR}/autoep/library/example_plugin_ep_kernel_registry/kernels/relu.cc"
"${TEST_SRC_DIR}/autoep/library/example_plugin_ep_kernel_registry/kernels/mul.h"
"${TEST_SRC_DIR}/autoep/library/example_plugin_ep_kernel_registry/kernels/mul.cc")
onnxruntime_add_shared_library_module(example_plugin_ep_kernel_registry ${onnxruntime_autoep_test_example_plugin_ep_kernel_registry_src})
target_include_directories(example_plugin_ep_kernel_registry PRIVATE ${REPO_ROOT}/include/onnxruntime/core/session)
target_link_libraries(example_plugin_ep_kernel_registry PRIVATE onnxruntime ${GSL_TARGET})

if(UNIX)
if (APPLE)
set(ONNXRUNTIME_EXAMPLE_PLUGIN_EP_KERNEL_REGISTRY_LINK_FLAG "-Xlinker -dead_strip")
elseif (NOT CMAKE_SYSTEM_NAME MATCHES "AIX")
string(CONCAT ONNXRUNTIME_EXAMPLE_PLUGIN_EP_KERNEL_REGISTRY_LINK_FLAG
"-Xlinker --version-script=${TEST_SRC_DIR}/autoep/library/example_plugin_ep_kernel_registry/ep_lib.lds "
"-Xlinker --no-undefined -Xlinker --gc-sections -z noexecstack")
endif()
else()
set(ONNXRUNTIME_EXAMPLE_PLUGIN_EP_KERNEL_REGISTRY_LINK_FLAG
"-DEF:${TEST_SRC_DIR}/autoep/library/example_plugin_ep_kernel_registry/ep_lib.def")
endif()

set_property(TARGET example_plugin_ep_kernel_registry APPEND_STRING PROPERTY LINK_FLAGS
${ONNXRUNTIME_EXAMPLE_PLUGIN_EP_KERNEL_REGISTRY_LINK_FLAG})

set_target_properties(example_plugin_ep_kernel_registry PROPERTIES FOLDER "ONNXRuntimeTest")
source_group(TREE ${TEST_SRC_DIR} FILES ${onnxruntime_autoep_test_example_plugin_ep_kernel_registry_src})

#
# test library
#
Expand Down Expand Up @@ -2129,7 +2173,7 @@ if (onnxruntime_BUILD_SHARED_LIB AND
TARGET onnxruntime_autoep_test
SOURCES ${onnxruntime_autoep_test_SRC} ${onnxruntime_unittest_main_src}
LIBS ${onnxruntime_autoep_test_LIBS}
DEPENDS ${all_dependencies} example_plugin_ep example_plugin_ep_virt_gpu
DEPENDS ${all_dependencies} example_plugin_ep example_plugin_ep_virt_gpu example_plugin_ep_kernel_registry
)
endif()

Expand Down
87 changes: 87 additions & 0 deletions include/onnxruntime/core/session/onnxruntime_cxx_api.h
Original file line number Diff line number Diff line change
Expand Up @@ -644,6 +644,9 @@ ORT_DEFINE_RELEASE(ValueInfo);

ORT_DEFINE_RELEASE_FROM_API_STRUCT(ModelCompilationOptions, GetCompileApi);
ORT_DEFINE_RELEASE_FROM_API_STRUCT(EpDevice, GetEpApi);
ORT_DEFINE_RELEASE_FROM_API_STRUCT(KernelDef, GetEpApi);
ORT_DEFINE_RELEASE_FROM_API_STRUCT(KernelDefBuilder, GetEpApi);
ORT_DEFINE_RELEASE_FROM_API_STRUCT(KernelRegistry, GetEpApi);

// This is defined explicitly since OrtTensorRTProviderOptionsV2 is not a C API type,
// but the struct has V2 in its name to indicate that it is the second version of the options.
Expand Down Expand Up @@ -3286,5 +3289,89 @@ struct Model : detail::ModelImpl<OrtModel> {
explicit Model(const std::vector<DomainOpsetPair>& opsets);
#endif
};

namespace detail {
template <typename T>
struct ConstKernelDefImpl : Base<T> {
using B = Base<T>;
using B::B;

///< Wraps OrtEpApi::KernelDef_GetOperatorType
const char* GetOperatorType() const;

///< Wraps OrtEpApi::KernelDef_GetDomain
const char* GetDomain() const;

///< Wraps OrtEpApi::KernelDef_GetSinceVersion
std::pair<int, int> GetSinceVersion() const;

///< Wraps OrtEpApi::KernelDef_GetExecutionProvider
const char* GetExecutionProvider() const;

///< Wraps OrtEpApi::KernelDef_GetInputMemType
OrtMemType GetInputMemType(size_t input_index) const;

///< Wraps OrtEpApi::KernelDef_GetOutputMemType
OrtMemType GetOutputMemType(size_t output_index) const;
};
} // namespace detail

using ConstKernelDef = detail::ConstKernelDefImpl<detail::Unowned<const OrtKernelDef>>;

struct KernelDef : detail::ConstKernelDefImpl<OrtKernelDef> {
using Base = detail::ConstKernelDefImpl<OrtKernelDef>;
using Base::Base;

explicit KernelDef(std::nullptr_t) {}
explicit KernelDef(OrtKernelDef* p) : detail::ConstKernelDefImpl<OrtKernelDef>{p} {}

ConstKernelDef GetConst() const { return ConstKernelDef{this->p_}; }
};

/** \brief Builder for OrtKernelDef.
*
* Used by plugin EPs to build a kernel definition.
*/
struct KernelDefBuilder : detail::Base<OrtKernelDefBuilder> {
KernelDefBuilder(); ///< Wraps OrtEpApi::CreateKernelDefBuilder
explicit KernelDefBuilder(std::nullptr_t) {} ///< Create an empty object, must be assigned a valid one to be used
explicit KernelDefBuilder(OrtKernelDefBuilder* ort_kernel_def_builder);

KernelDefBuilder& SetOperatorType(const char* op_type);
KernelDefBuilder& SetDomain(const char* domain);
KernelDefBuilder& SetSinceVersion(int since_version_start, int since_version_end);
KernelDefBuilder& SetExecutionProvider(const char* ep_name);
KernelDefBuilder& SetInputMemType(size_t input_index, OrtMemType mem_type);
KernelDefBuilder& SetOutputMemType(size_t output_index, OrtMemType mem_type);
KernelDefBuilder& AddTypeConstraint(const char* arg_name, const OrtDataType* data_type);
KernelDefBuilder& AddTypeConstraint(const char* arg_name, const std::vector<const OrtDataType*>& data_types);
KernelDefBuilder& AddInputOutputAlias(int input_index, int output_index);
KernelDefBuilder& AddInputOutputAliases(const std::vector<int>& input_indices,
const std::vector<int>& output_indices);
KernelDefBuilder& AddInputOutputMutableAlias(int input_index, int output_index);
KernelDefBuilder& AddInputOutputMutableAliases(const std::vector<int>& input_indices,
const std::vector<int>& output_indices);

KernelDef Build();
};

/** \brief Registry for kernels supported by an EP.
*
* Used by plugin EPs to register definitions for supported kernels.
*/
struct KernelRegistry : detail::Base<OrtKernelRegistry> {
///< Wrapper around OrtEpApi::CreateKernelRegistry
KernelRegistry();

///< Create an empty object, must be assigned a valid one to be used
explicit KernelRegistry(std::nullptr_t) {}

///< Take ownership of a pointer created with the C API.
explicit KernelRegistry(OrtKernelRegistry* ort_kernel_registry);

///< Wraps KernelRegistry_AddKernel
Status AddKernel(const OrtKernelDef* kernel_def, OrtKernelCreateFunc kernel_create_func,
void* kernel_create_func_state);
};
} // namespace Ort
#include "onnxruntime_cxx_inline.h"
141 changes: 141 additions & 0 deletions include/onnxruntime/core/session/onnxruntime_cxx_inline.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
#include <iterator>
#include <string>
#include <type_traits>
#include <utility>
#include <vector>

// Convert OrtStatus to Ort::Status and return
Expand Down Expand Up @@ -3560,4 +3561,144 @@ inline Model::Model(const std::vector<DomainOpsetPair>& opsets) {
}
#endif

namespace detail {
template <typename T>
inline const char* ConstKernelDefImpl<T>::GetOperatorType() const {
return GetEpApi().KernelDef_GetOperatorType(this->p_);
}

template <typename T>
inline const char* ConstKernelDefImpl<T>::GetDomain() const {
return GetEpApi().KernelDef_GetDomain(this->p_);
}

template <typename T>
inline std::pair<int, int> ConstKernelDefImpl<T>::GetSinceVersion() const {
int start = 0;
int end = 0;

ThrowOnError(GetEpApi().KernelDef_GetSinceVersion(this->p_, &start, &end));
return std::pair<int, int>(start, end);
}

template <typename T>
inline const char* ConstKernelDefImpl<T>::GetExecutionProvider() const {
return GetEpApi().KernelDef_GetExecutionProvider(this->p_);
}

template <typename T>
inline OrtMemType ConstKernelDefImpl<T>::GetInputMemType(size_t input_index) const {
OrtMemType mem_type{};
ThrowOnError(GetEpApi().KernelDef_GetInputMemType(this->p_, input_index, &mem_type));

return mem_type;
}

template <typename T>
inline OrtMemType ConstKernelDefImpl<T>::GetOutputMemType(size_t output_index) const {
OrtMemType mem_type{};
ThrowOnError(GetEpApi().KernelDef_GetOutputMemType(this->p_, output_index, &mem_type));

return mem_type;
}
} // namespace detail

inline KernelDefBuilder::KernelDefBuilder() {
ThrowOnError(GetEpApi().CreateKernelDefBuilder(&p_));
}

inline KernelDefBuilder::KernelDefBuilder(OrtKernelDefBuilder* p) : detail::Base<OrtKernelDefBuilder>{p} {
}

inline KernelDefBuilder& KernelDefBuilder::SetOperatorType(const char* op_type) {
ThrowOnError(GetEpApi().KernelDefBuilder_SetOperatorType(p_, op_type));
return *this;
}

inline KernelDefBuilder& KernelDefBuilder::SetDomain(const char* domain) {
ThrowOnError(GetEpApi().KernelDefBuilder_SetDomain(p_, domain));
return *this;
}

inline KernelDefBuilder& KernelDefBuilder::SetSinceVersion(int since_version_start, int since_version_end) {
ThrowOnError(GetEpApi().KernelDefBuilder_SetSinceVersion(p_, since_version_start, since_version_end));
return *this;
}

inline KernelDefBuilder& KernelDefBuilder::SetExecutionProvider(const char* ep_name) {
ThrowOnError(GetEpApi().KernelDefBuilder_SetExecutionProvider(p_, ep_name));
return *this;
}

inline KernelDefBuilder& KernelDefBuilder::SetInputMemType(size_t input_index, OrtMemType mem_type) {
ThrowOnError(GetEpApi().KernelDefBuilder_SetInputMemType(p_, input_index, mem_type));
return *this;
}

inline KernelDefBuilder& KernelDefBuilder::SetOutputMemType(size_t output_index, OrtMemType mem_type) {
ThrowOnError(GetEpApi().KernelDefBuilder_SetOutputMemType(p_, output_index, mem_type));
return *this;
}

inline KernelDefBuilder& KernelDefBuilder::AddTypeConstraint(const char* arg_name,
const OrtDataType* data_type) {
ThrowOnError(GetEpApi().KernelDefBuilder_AddTypeConstraint(p_, arg_name, &data_type, 1));
return *this;
}

inline KernelDefBuilder& KernelDefBuilder::AddTypeConstraint(const char* arg_name,
const std::vector<const OrtDataType*>& data_types) {
ThrowOnError(GetEpApi().KernelDefBuilder_AddTypeConstraint(p_, arg_name, data_types.data(), data_types.size()));
return *this;
}

inline KernelDefBuilder& KernelDefBuilder::AddInputOutputAlias(int input_index, int output_index) {
ThrowOnError(GetEpApi().KernelDefBuilder_AddInputOutputAliases(p_, &input_index, &output_index, 1));
return *this;
}

inline KernelDefBuilder& KernelDefBuilder::AddInputOutputAliases(const std::vector<int>& input_indices,
const std::vector<int>& output_indices) {
if (input_indices.size() != output_indices.size()) {
ORT_CXX_API_THROW("Expecting input and output indices to have the same element count", ORT_INVALID_ARGUMENT);
}

ThrowOnError(GetEpApi().KernelDefBuilder_AddInputOutputAliases(p_, input_indices.data(), output_indices.data(),
input_indices.size()));
return *this;
}

inline KernelDefBuilder& KernelDefBuilder::AddInputOutputMutableAlias(int input_index, int output_index) {
ThrowOnError(GetEpApi().KernelDefBuilder_AddInputOutputMutableAliases(p_, &input_index, &output_index, 1));
return *this;
}

inline KernelDefBuilder& KernelDefBuilder::AddInputOutputMutableAliases(const std::vector<int>& input_indices,
const std::vector<int>& output_indices) {
if (input_indices.size() != output_indices.size()) {
ORT_CXX_API_THROW("Expecting input and output indices to have the same element count", ORT_INVALID_ARGUMENT);
}

ThrowOnError(GetEpApi().KernelDefBuilder_AddInputOutputMutableAliases(p_, input_indices.data(), output_indices.data(),
input_indices.size()));
return *this;
}

inline KernelDef KernelDefBuilder::Build() {
OrtKernelDef* kernel_def = nullptr;
ThrowOnError(GetEpApi().KernelDefBuilder_Build(p_, &kernel_def));
return KernelDef(kernel_def);
}

inline KernelRegistry::KernelRegistry() {
ThrowOnError(GetEpApi().CreateKernelRegistry(&p_));
}

inline KernelRegistry::KernelRegistry(OrtKernelRegistry* p) : detail::Base<OrtKernelRegistry>{p} {
}

inline Status KernelRegistry::AddKernel(const OrtKernelDef* kernel_def, OrtKernelCreateFunc kernel_create_func,
void* kernel_create_func_state) {
return Status{GetEpApi().KernelRegistry_AddKernel(p_, kernel_def, kernel_create_func, kernel_create_func_state)};
}
} // namespace Ort
Loading
Loading