热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【Tengine端侧推理框架】——注册机制(一)

code:https:github.comOAIDTengine图片,代码都来自以上项目。1.简介Tengine由OPENAILAB主导开发ÿ

code:https://github.com/OAID/Tengine
图片,代码都来自以上项目。
在这里插入图片描述


1. 简介

Tengine 由 OPEN AI LAB 主导开发,该项目实现了深度学习神经网络模型在嵌入式设备上的快速、高效部署需求。为实现在众多 AIoT 应用中的跨平台部署,本项目使用 C 语言进行核心模块开发,针对嵌入式设备资源有限的特点进行了深度框架裁剪。同时采用了完全分离的前后端设计,有利于 CPU、GPU、NPU 等异构计算单元的快速移植和部署,降低评估、迁移成本。

2. Content

因为Tengine是由C语言开发的,和ncnn,mnn等用C++开发的框架有一定的区别。因为只能用函数,所以op,serializer(模型解析器)等的注册都是要在程序的时候进行的。而且对op,serializer等组织需要使用函数指针来模拟C++的多态性

这里对op的注册机制进行解读。

首先给出数据结构之间的关系图:
在这里插入图片描述

2.1 流程

这里只是对op_methodop_name的注册梳理,以absval的注册为例

  • 定义好absvalop_methodop_name

struct method m;
m.version = 1;
m.init = init_op; // 函数指针
m.release = release_op; // 函数指针return register_op(OP_ABSVAL, OP_ABSVAL_NAME, &m);

  • 初始化static vector_t* internal_op_method_registrystatic vector_t* internal_op_name_registry这里可以就着上面的关系图进行梳理

这里最外面的容器是vector_t, 然后vector_tmem才是指向注册数据的位置。mem指向8个vector_entry_t空间(初始为8个,如果不够了按8个递增申请),valid指示数据是否写入,这里的unsigned char data[]指明method,op_name在内存的初始位置。后面在使用的时候,就在internal_op_method_registryinternal_op_name_registry去找。

vector_t* v &#61; (vector_t*)sys_malloc(sizeof(vector_t));if (v &#61;&#61; NULL){return NULL;}v->elem_num &#61; 0;v->elem_size &#61; elem_size;v->free_func &#61; free_data;v->entry_size &#61; align(elem_size &#43; (int)sizeof(vector_entry_t), TE_VECTOR_ALIGN_SIZE); // 32&#xff0c; 要写入的数据 字节数v->ahead_num &#61; 8; // 为什么有8个空间&#xff0c; 以8的倍数进行拓展v->space_num &#61; v->ahead_num;v->real_mem &#61; sys_malloc(v->entry_size * v->space_num &#43; TE_VECTOR_ALIGN_SIZE); // 32*8&#43;8v->mem &#61; align_address(v->real_mem, TE_VECTOR_ALIGN_SIZE); // align &#61; 8, 对申请的内存进行 8 字节对齐for (int i &#61; 0; i < v->space_num; i&#43;&#43;){vector_entry_t* e &#61; get_vector_entry(v, i); // 前面放 vector_entry_te->valid &#61; 0; // 是否写入的标志位}return v;

  • 注册op_name
    下面的 push_vector_data , 会用 memcpy 把栈上的数据内容 copy 到已申请的堆内存上memcpy(e->data, data, v->elem_size);

ir_op_name_entry_t op_map;op_map.type &#61; type;op_map.name &#61; name;return push_vector_data(internal_op_name_registry, &op_map); // 写入数据&#xff0c;如果

  • 同理注册method
    这里在注册前会internal_op_method_registry遍历&#xff0c;看是否已经注册

static int register_op_registry(ir_method_t* method)
{if (find_op_method(method->type, method->version)) // 遍历检查是否已经注册{return -1;}return push_vector_data(internal_op_method_registry, method);
}

总结


  • 总结起来就是把各个opir_method_t数据保存到internal_op_method_registry&#xff0c; ir_op_name_entry_t数据保存到internal_op_name_registry
  • 对照着上面的数据关系图来梳理

推荐阅读
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了在Windows系统上使用C语言命令行参数启动程序并传递参数的方法,包括接收参数程序的代码和bat文件的编写方法,同时给出了程序运行的结果。 ... [详细]
  • 本文介绍了H5游戏性能优化和调试技巧,包括从问题表象出发进行优化、排除外部问题导致的卡顿、帧率设定、减少drawcall的方法、UI优化和图集渲染等八个理念。对于游戏程序员来说,解决游戏性能问题是一个关键的任务,本文提供了一些有用的参考价值。摘要长度为183字。 ... [详细]
  • STL迭代器的种类及其功能介绍
    本文介绍了标准模板库(STL)定义的五种迭代器的种类和功能。通过图表展示了这几种迭代器之间的关系,并详细描述了各个迭代器的功能和使用方法。其中,输入迭代器用于从容器中读取元素,输出迭代器用于向容器中写入元素,正向迭代器是输入迭代器和输出迭代器的组合。本文的目的是帮助读者更好地理解STL迭代器的使用方法和特点。 ... [详细]
  • 本文介绍了Cocos2dx学习笔记中的更新函数scheduleUpdate、进度计时器CCProgressTo和滚动视图CCScrollView的用法。详细介绍了scheduleUpdate函数的作用和使用方法,以及schedule函数的区别。同时,还提供了相关的代码示例。 ... [详细]
  • 本文介绍了GTK+中的GObject对象系统,该系统是基于GLib和C语言完成的面向对象的框架,提供了灵活、可扩展且易于映射到其他语言的特性。其中最重要的是GType,它是GLib运行时类型认证和管理系统的基础,通过注册和管理基本数据类型、用户定义对象和界面类型来实现对象的继承。文章详细解释了GObject系统中对象的三个部分:唯一的ID标识、类结构和实例结构。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • PHP图片截取方法及应用实例
    本文介绍了使用PHP动态切割JPEG图片的方法,并提供了应用实例,包括截取视频图、提取文章内容中的图片地址、裁切图片等问题。详细介绍了相关的PHP函数和参数的使用,以及图片切割的具体步骤。同时,还提供了一些注意事项和优化建议。通过本文的学习,读者可以掌握PHP图片截取的技巧,实现自己的需求。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 本文研究了使用条件对抗网络进行图片到图片翻译的方法,并提出了一种通用的解决方案。通过学习输入图像到输出图像的映射和训练相应的损失函数,我们可以解决需要不同损失函数公式的问题。实验证明该方法在合成图片、重构目标和给图片着色等多个问题上都很有效。这项工作的重要发现是不再需要人为构建映射函数和损失函数,同时能够得出合理的结果。本文的研究对于图片处理、计算机图片合成和计算机视觉等领域具有重要意义。 ... [详细]
author-avatar
广药中山校区艺术团啦啦队
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有