onnxruntime源码解析之C接口简介
一、C接口
1. 简介
其他语言的接口都是在C接口的基础上,进一步的封装。
C的接口头文件为:onnxruntime_c_api.h
头文件内包含了详细的注释和说明。
总体上,除了一些数据结构的定义,C API 函数封装在如下结构体内,
struct OrtApi {
// 其中包含了一些函数指针,如下所示,
OrtStatus*(ORT_API_CALL* CreateStatus)(OrtErrorCode code, \
_In_ const char* msg)NO_EXCEPTION ORT_ALL_ARGS_NONNULL;
// ...
}
OrtApi的使用方式,一般是定义全局的指针OrtApi* g_ort;
然后,通过OrtGetApiBase()->GetApi(ORT_API_VERSION)获得struct Api*。
#include "onnxruntime_c_api.h"
OrtApi* g_ort = nullptr; int main() {
g_ort = OrtGetApiBase()->GetApi(ORT_API_VERSION);
return 0;
}
ORT_API_VERSION是头文件中定义的全局的宏,必须与链接的libonnxruntime.so内的相同。否则,会发生运行时的错误。
这里的函数OrtGetApiBase()->GetApi每次返回的指针,是相同的。因此,可以定义全局指针g_ort,方便后续调用OrtApi内的函数指针。
调用函数指针的方式,与C++普通成员函数类似。唯一的差别是,C++成员函数的第一个参数是this指针。
2. Api定义方式
struct OrtApi结构体内的函数指针定义,包含了大量的注释和宏。
大体上容易阅读的,需要注意的是很多宏仅仅是说明的作用,并没有生成二进制代码。
例如,
// 这些宏仅仅用作说明,函数参数的意义。
// 用来标志参数是输入还是输出,等等。
#define _In_
#define _In_z_
#define _In_opt_
#define _In_opt_z_
#define _Out_
#define _Outptr_
#define _Out_opt_
以一个struct OrtApi内的实际函数接口为例,
ORT_API2_STATUS(CreateEnv, OrtLoggingLevel log_severity_level, _In_ const char* logid, \
_Outptr_ OrtEnv** out); // 这里的ORT_API2_STATUS是个宏,展开后,如下所示, _Check_return_ _Ret_maybenull_ OrtStatusPtr(ORT_API_CALL* CreateEnv)(OrtLoggingLevel log_severity_level, \
const char* logid, OrtEnv** out) NO_EXCEPTION ORT_MUST_USE_RESULT; // 上面实际上定义了一个函数指针(* CreateEnv),返回值是OrtStatusPtr
// 输入是(OrtLoggingLevel log_severity_level, const char* logid, OrtEnv** out)
// 其他下线开头的字符串,以及ORT_API_CALL
// 是一些说明性的宏,NO_EXCEPTION/ORT_MUST_USE_RESULT在不同平台下,不同的编译选项,有相对性的功能。
上述函数指针的调用方式是,
OrtEnv* my_ort_env;
auto current_ort_status = g_ort->CreateEnv(my_log_level, \
"my_log_id", &my_ort_env);
onnxruntime源码解析之C接口简介的更多相关文章
- identityserver4源码解析_2_元数据接口
目录 identityserver4源码解析_1_项目结构 identityserver4源码解析_2_元数据接口 identityserver4源码解析_3_认证接口 identityserver4 ...
- identityserver4源码解析_3_认证接口
目录 identityserver4源码解析_1_项目结构 identityserver4源码解析_2_元数据接口 identityserver4源码解析_3_认证接口 identityserver4 ...
- Spring源码解析 - AbstractBeanFactory 实现接口与父类分析
我们先来看类图吧: 除了BeanFactory这一支的接口,AbstractBeanFactory主要实现了AliasRegistry和SingletonBeanRegistry接口. 这边主要提供了 ...
- 开源地图SharpMap源码解析-(1)简介
1.简介 SharpMap最新版基于.NET Framework 4,采用C#开发的地图渲染引擎,非常易于使用.我这次研究的是比较稳定发布的V1.1版本.可以在GitHub下载该源码,地址:https ...
- Java基础——集合源码解析 List List 接口
今天我们来学习集合的第一大体系 List. List 是一个接口,定义了一组元素是有序的.可重复的集合. List 继承自 Collection,较之 Collection,List 还添加了以下操作 ...
- 【Dubbo 源码解析】01_Dubbo 设计简介
Dubbo 设计简介 Dubbo 采用 Microkernel + Plugin (微内核 + 插件)模式,Microkernel 只负责组装 Plugin,Dubbo 自身的功能也是通过扩展点实现的 ...
- IdentityServer4源码解析_4_令牌发放接口
目录 identityserver4源码解析_1_项目结构 identityserver4源码解析_2_元数据接口 identityserver4源码解析_3_认证接口 identityserver4 ...
- IdentityServer4源码解析_5_查询用户信息接口
协议简析 UserInfo接口是OAuth2.0中规定的需要认证访问的接口,可以返回认证用户的声明信息.请求UserInfo接口需要使用通行令牌.响应报文通常是json数据格式,包含了一组claim键 ...
- AspNetCore3.1_Secutiry源码解析_8_Authorization_授权框架
目录 AspNetCore3.1_Secutiry源码解析_1_目录 AspNetCore3.1_Secutiry源码解析_2_Authentication_核心流程 AspNetCore3.1_Se ...
- IdentityServer4源码解析_1_项目结构
目录 IdentityServer4源码解析_1_项目结构 IdentityServer4源码解析_2_元数据接口 IdentityServer4源码解析_3_认证接口 IdentityServer4 ...
随机推荐
- JavaScript之void
void是什么 void是JavaScript重要的关键字,该操作符指定要计算一个表达式但不返回. 语法格式: void func() javascript:void func() 或 void (f ...
- listview自定义适配器
class FruitAdapter(activity: Activity ,val id:Int,data:List<Fruit>):ArrayAdapter<Fruit>( ...
- go常见的坑
1. for循环中使用短变量声明初始值 案例1: type Data struct { d *int } func main() { list := make([]Data, 0) for i := ...
- php正方形图片转成成圆形图片-GD
/** * 剪切图片为圆形 * @param $picture 图片数据流 比如file_get_contents(imageurl)返回的东东 * @return 图片数据流 */ private ...
- Python实现XX短视频加密算法抓包分析及刷邀请
Python实现XX短视频加密算法抓包分析及刷邀请 出自:https://zhuanlan.zhihu.com/p/466929667?utm_id=0 Python彳余 一个会常常更新互联网,编程的 ...
- el-inpu 输入框,输入一个字符失去焦点,不能连续输入问题
问题出现的原因:输入框绑定值改变导致代码从新渲染 <div v-for="(x,index) in item.newAttrs " :key="x.en" ...
- Kubernetes 安装网络插件(calico)
简介 Calico是Kubernetes生态系统中另一种流行的网络选择.虽然Flannel被公认为是最简单的选择,但Calico以其性能.灵活性而闻名.Calico的功能更为全面,不仅提供主机和pod ...
- 其他6-break,continue,exit,return区别
break.continue.exit.return的区别 break 跳出整个循环语句 continue 跳过本次循环,进入下一次循环语句 exit n 退出当前shell,并返回状态值 retur ...
- 编译报错Could NoT find Threads (missing: Threads FOUND)
解决方法1: 原来的命令行加上-lpthread 解决方法2: -DCMAKE_THREAD_LIBS_INIT=-lpthread
- 数位dp( tzoj6061:Bomb-求49个数;tzoj1427: 不要62)
6061:http://www.tzcoder.cn/acmhome/problemdetail.do?method=showdetail&id=6061 dfs记忆化搜索 #include& ...