首页 > 编程语言 >onnxruntime源码解析之C接口简介

onnxruntime源码解析之C接口简介

时间:2022-11-14 20:01:19浏览次数:33  
标签:API onnxruntime 简介 ORT 接口 源码 OrtApi ort define

一、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);

 

标签:API,onnxruntime,简介,ORT,接口,源码,OrtApi,ort,define
From: https://www.cnblogs.com/tangjicheng/p/16890184.html

相关文章

  • 直播小程序源码,小程序移动端登录界面调整布局
    直播小程序源码,小程序移动端登录界面调整布局XML布局代码如下: <?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="http://schemas.android.com/apk......
  • IIC协议简介
    IIC总线介绍IIC也称I2C,是一个多主从的串行总线,由飞利浦公司发明的通讯总线,属于半双工同步传输类总线,仅由两条线就能完成多机通讯,一条SCL时钟线,另外一条双向数据线SDA,IIC总......
  • SCI简介和写作顺序
    一、SCI论文组成部分简介一篇完整的sci论文主要包括以下几个主要的组成部分,从前往后依次分别是Title就是说这个文章的标题其次是Abstract也就是这个文章的摘要。接......
  • Java多线程简介
    一、线程简介Process进程与Thread线程程序是指令和数据的有序集合,本身没有任何运行的含义,为静态概念。进程是执行程序的一次执行过程,为动态概念。是系统资源分配的单位......
  • vue源码分析-响应式系统(二)
    为了深入介绍响应式系统的内部实现原理,我们花了一整节的篇幅介绍了数据(包括data,computed,props)如何初始化成为响应式对象的过程。有了响应式数据对象的知识,上一节的后......
  • vue源码分析-响应式系统(三)
    上一节,我们深入分析了以data,computed为数据创建响应式系统的过程,并对其中依赖收集和派发更新的过程进行了详细的分析。然而在使用和分析过程中依然存在或多或少的问题,这......
  • vue源码分析-响应式系统(一)
    从这一小节开始,正式进入Vue源码的核心,也是难点之一,响应式系统的构建。这一节将作为分析响应式构建过程源码的入门,主要分为两大块,第一块是针对响应式数据props,methods,da......
  • RabbitMq简介
    RabbitMq简介RabbitMQ是一个由erlang开发的AMQP(AdvancedMessageQueue高级消息队列协议)的开源实现,由于erlang语言的高并发特性,性能较好,本质是个队列,FIFO先入先出,里面......
  • Java项目精选|Java毕业设计项目源码
    【IT学长】Java项目精选,做毕业设计、课程设计、入门项目实战的伙伴可以参考项目名称:​​《SSM+MySQL+JSP教务管理系统设计与实现(附源码下载地址)》​​使用技术:Java+Sprin......
  • NFV简介-华为
    转自:https://info.support.huawei.com/info-finder/encyclopedia/zh/NFV.html1.什么是NFV 网络功能虚拟化(NetworkFunctionsVirtualization,NFV)是一种关于网络架构的概......