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 ...
随机推荐
- MySQL联合索引的创建规则
1.索引应该按照最常用于查询的列的顺序创建.这样可以最大程度地提高查询性能. 2.如果查询中包含的列与索引中的列顺序不一致,则无法使用索引.因此,如果您有多个查询,每个查询都包含不同的列,那么最好为每 ...
- 看了这本基础教程的书籍你还担心你的python学不好吗?
python基础教程(第二版)PDF高清版免费下载地址: 提取码:chcj 值得花时间阅读的一本书 内容简介 · · · · · · 本书是经典教程的全新改版,作者根据Python 3.0版本的种种 ...
- 基于AD9361的双收双发射频FMC子卡
FMC177-基于AD9361的双收双发射频FMC子卡 一.板卡介绍 FMC177射频模块分别包含两个接收通道与发射通道,其频率可覆盖达到70MHz~6GHz,AD9361芯片提供具有成本效益的实验平 ...
- VUE学习-渲染函数
渲染函数 x-template 引入外面组件文件写法 <template> <h1 v-if="level === 1"> <slot>< ...
- Wordpress主题twentytwelve修改首页文章摘要
方法:网站后台->外观->编辑->找到content.php文件 路径:wp-content/themes/twentytwelve/ 找到这一句: <?php if ( is ...
- 【SQL Server】按日期分组产品
1 SELECT sell_date ,COUNT(1) AS num_sold, 2 STUFF(( 3 SELECT ',' + son.product 4 FROM (SELECT DISTIN ...
- goalng 将字符串转化成整数后取余
package main import ( "fmt" "github.com/google/uuid" "hash/fnv" ) func ...
- Linux Conda 使用activate无法进入环境,但list中有环境的路径
安装OpenFace时装了个miniconda,之后就进不去anaconda的其它环境了: (pfld) .....$ conda env list # conda environments: # / ...
- VUE+Element+若依随笔001:点击左侧菜单跳转外部链接配置并传参数
一.后台菜单配置部分:1.菜单管理中:新增父级目录2.配置内容: 菜单名称:测试用菜单 菜单路径:https://www.baidu.com/ 此处需要配置要跳转你的外部链接 组件名称:testMen ...
- ZooKeeper的主要应用场景
什么是Zookeeper ZooKeeper主要服务于分布式系统,可以用ZooKeeper来做:统一配置管理.统一命名服务.分布式锁.集群管理. 使用分布式系统就无法避免对节点管理的问题(需要实时感知 ...