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

最新文章

  1. Tomcat开机自启动
  2. C和指针 第五章 习题
  3. 如何修改Hadoop的默认日志级别,还真是麻烦
  4. ADO.NET封装的SqlHelper
  5. HoloLens开发手记 - Unity之Tracking loss
  6. light oj 1236 分解质因数
  7. 浅谈JSON.parse()、JSON.stringify()和eval()的作用
  8. android生成json
  9. 7、XML加强/Web开发/Tomcat
  10. &lt;input type=&quot;hidden&quot; id=&quot;haha&quot; name=&quot;wang&quot; value=&quot;xiaodong&quot; /&gt;
  11. POJ 2376 Cleaning Shifts 贪心
  12. HighlightingSystem插件使用(边缘发光)
  13. Random在高并发下的缺陷以及JUC对其的优化
  14. windows下apache+https环境配置
  15. Linux实时查询GPU使用命令
  16. Ubuntu下JDK1.8安装后配置环境变量
  17. Educational Codeforces Round 23 E. Choosing The Commander trie数
  18. ps记录
  19. kafka消费者客户端启动之后消费不到消息的原因分析
  20. 对faster rcnn 中rpn层的理解

热门文章

  1. 昇腾AI新技能,还能预防猪生病?
  2. No.2.2
  3. js中各种函数
  4. 【剑指Offer】【字符串】字符串的排列
  5. Cisco ASA防火墙恢复密码和基本配置
  6. 动态class 及 动态style
  7. 数值分析之数值积分 4.X
  8. 关于JMeter WebSocket插件:JMeter WebSocket插件-关闭SignalR连接--webSocket Close报错
  9. react native SectionList组件实现多选
  10. Mac卡顿 CPU占100%的原因Photolibraryd