onnxruntime源码解析之C接口实现
onnxruntime的C接口,位置为include/onnxruntime/core/session/onnxruntime_c_api.h。
上述文件包含了C函数的声明,对应的实现在onnxruntime/core/session/onnxruntime_c_api.cc内。
与定义的时候类似,实现的函数使用宏ORT_API_STATUS_IMPL进行定义。
一、OrtEnv
OrtEnv在onnxruntime_c_api.h中声明,通过宏ORT_RUNTIME_CLASS(Env)。
在头文件中,只会用到OrtEnv的指针,不会用到实现,因此不会发生编译错误。
OrtEnv的实现在onnxruntime_c_api.cc中,这里的实现用的是class,但是声明为struct。
这在C++中是允许的,因为C++不区分class和struct,两者只有默认访问权限的区别。
// struct与class混用
#include <iostream>
struct A;
void my_print(A* a);
class A {
public:
void print() {
std::cout << "Hello\n";
}
};
void my_print(A* a) {
a->print();
};
int main() {
A x;
my_print(&x);
return 0;
}
OrtEnv实现了一个单例类,主要负责日志和会话间共享分配器的管理。
OrtEnv实际上只是对onnxruntime::Environment的简单封装,日志管理和分配器的管理都在onnxruntime::Environment中实现。
OrtEnv相当于一个中间层,或者说,充当C接口与C++实现的兼容的中间类。
onnxruntime的C接口中的,其他一些类也与OrtEnv类相似。
引用计数
可以注意到,这里的OrtEnv作为一个单例,与通常设计模式的单例,稍有区别。
主要添加了一个引用计数ref_count_。
当GetInstance()时,如果还没有创建局部静态对象OrtEnv,那么创建一个OrtEnv,用p_instance_保存。
如果已经创建了p_instance_,那么只要ref_count_加一,返回p_instance_。
Release()释放时,检查ref_count_即可。
线程间互斥锁
OrtEnv是被全局共享的,不同的会话session在不同的线程。因此需要mutex。
onnxruntime使用OrtMutex代替std::mutex。说明如下,
// Q: Why OrtMutex is better than std::mutex
// A: OrtMutex supports static initialization but std::mutex doesn't. Static initialization helps us prevent the "static
// initialization order problem". // Q: Why std::mutex can't make it?
// A: VC runtime has to support Windows XP at ABI level. But we don't have such requirement. // Q: Is OrtMutex faster than std::mutex?
// A: Sure
二、onnxruntime::Environment
前面说到OrtEnv只是对onnxruntime::Enviroonment的简单封装。
Environment里面主要包含了,1个日志管理器,1个会话间共享的分配器,2个线程池(分别用于Op内和Op间)。
Environment类通过静态函数Create去创建自己,类似工厂方法;而不是直接在构造函数内进行初始化。
这样可以更好的控制对象的初始化,在初始化过程做更多的操作。在Initialize函数内实现。
Initialize函数内,主要做了3件事。
1. 传入一个日志管理器。
2. 创建2个线程池。
3. 根据不同的编译选项,注册各组的Op
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接口. 这边主要提供了 ...
- Java基础——集合源码解析 List List 接口
今天我们来学习集合的第一大体系 List. List 是一个接口,定义了一组元素是有序的.可重复的集合. List 继承自 Collection,较之 Collection,List 还添加了以下操作 ...
- IdentityServer4源码解析_4_令牌发放接口
目录 identityserver4源码解析_1_项目结构 identityserver4源码解析_2_元数据接口 identityserver4源码解析_3_认证接口 identityserver4 ...
- IdentityServer4源码解析_5_查询用户信息接口
协议简析 UserInfo接口是OAuth2.0中规定的需要认证访问的接口,可以返回认证用户的声明信息.请求UserInfo接口需要使用通行令牌.响应报文通常是json数据格式,包含了一组claim键 ...
- IdentityServer4源码解析_1_项目结构
目录 IdentityServer4源码解析_1_项目结构 IdentityServer4源码解析_2_元数据接口 IdentityServer4源码解析_3_认证接口 IdentityServer4 ...
- Spring-cloud & Netflix 源码解析:Eureka 服务注册发现接口 ****
http://www.idouba.net/spring-cloud-source-eureka-client-api/?utm_source=tuicool&utm_medium=refer ...
- MyBatis源码解析【7】接口式编程
前言 这个分类比较连续,如果这里看不懂,或者第一次看,请回顾之前的博客 http://www.cnblogs.com/linkstar/category/1027239.html 修改例子 在我们实际 ...
- 2) 接口规范 原生django接口、单查群查 postman工具 CBV源码解析
内容了解 """ .接口:什么是接口.restful接口规范 .CBV生命周期源码 - 基于restful规范下的CBV接口 .请求组件.解析组件.响应组件 .序列化组件 ...
随机推荐
- cowtransfer(奶牛快传)自动上传文件脚本—流程分析
cowtransfer(奶牛快传)自动上传文件脚本-流程分析 序言: 距离上传发文也有几天了,这几天也是将这个脚本优化了一下.如果还不清楚这个脚本的效果是怎么样的小伙伴可以看看我上篇文章.话不多说,我 ...
- 《HelloTester》第2期
1.前言 饭前喝汤:如果你的月薪低于1万,不要总想着"新机会",而更加重要的是"练手艺".当你有了一定的手艺可以施展,机会自然存在! 读了之前的简历篇,我想你对 ...
- 跟女朋友介绍十个常用的 Python 内置函数,她夸了我一整天
内置函数是什么 了解内置函数之前,先来了解一下什么是函数 将使用频繁的代码段进行封装,并给它起一个名字,当我们使用的时候只需要知道名字就行 函数就是一段封装好的.可以重复使用的代码,函数使得我们的程序 ...
- h5端安装调试工具,react版(但不限于react,vue等)
首先 npm install vconsole -S 其次在非生产环境的时候可以使用 import VConsole from 'vconsole'; const vConsole = new VCo ...
- Go指南:方法和接口
方法与指针重定向 带指针参数的函数必须接受一个指针: func ScaleFunc(v *Vertex, f float64) { v.X = v.X * f v.Y = v.Y * f} 以指针为接 ...
- C++实现链队列相关操作代码
#include<iostream>#include<cstdlib>using namespace std;#define MAXSIZE 100#define OK 1#d ...
- 动态class 及 动态style
动态改变某一范围内的字体颜色 低于90 大于90小于95 大于95 两种方法都可以 <div class="dhd-num4" :style="{'col ...
- #Cisco——配置链路聚合
Cisco--配置链路聚合 一.什么是链路聚合. 链路聚合(英语:Link Aggregation)是一个计算机网络术语,指将多个物理端口汇聚在一起,形成一个逻辑端口,以实现出/入流量吞吐量在各成员端 ...
- 一些JVM指令
1.jps:查看本机java进程信息. 2 .jstack:打印线程的栈信息,制作线程dump文件. 3.jmap:打印内存映射,制作堆dump文件 4.jstat:性能监控工具 5.jhat:内存分 ...
- Linux系统Shell脚本第一章:Shell脚本基础及时间同步
目录 一.Shell脚本基础 1.Shell作用 2.什么是Shell脚本及处理逻辑 3.shell脚本基本格式 4. shell脚本执行方式 5.实操演示 二.Shell脚本中的变量 1.变量的作用 ...