热门标签 | 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
  • 对照着上面的数据关系图来梳理

推荐阅读
  • 深入解析经典卷积神经网络及其实现代码
    深入解析经典卷积神经网络及其实现代码 ... [详细]
  • 兆芯X86 CPU架构的演进与现状(国产CPU系列)
    本文详细介绍了兆芯X86 CPU架构的发展历程,从公司成立背景到关键技术授权,再到具体芯片架构的演进,全面解析了兆芯在国产CPU领域的贡献与挑战。 ... [详细]
  • 在稀疏直接法视觉里程计中,通过优化特征点并采用基于光度误差最小化的灰度图像线性插值技术,提高了定位精度。该方法通过对空间点的非齐次和齐次表示进行处理,利用RGB-D传感器获取的3D坐标信息,在两帧图像之间实现精确匹配,有效减少了光度误差,提升了系统的鲁棒性和稳定性。 ... [详细]
  • 三角测量计算三维坐标的代码_双目三维重建——层次化重建思考
    双目三维重建——层次化重建思考FesianXu2020.7.22atANTFINANCIALintern前言本文是笔者阅读[1]第10章内容的笔记,本文从宏观的角度阐 ... [详细]
  • C语言中全部可用的数学函数有哪些?2.longlabs(longn);求长整型数的绝对值。3.doublefabs(doublex);求实数的绝对值。4.doublefloor(d ... [详细]
  • WinMain 函数详解及示例
    本文详细介绍了 WinMain 函数的参数及其用途,并提供了一个具体的示例代码来解析 WinMain 函数的实现。 ... [详细]
  • 最详尽的4K技术科普
    什么是4K?4K是一个分辨率的范畴,即40962160的像素分辨率,一般用于专业设备居多,目前家庭用的设备,如 ... [详细]
  • 本文介绍如何使用 Python 的 DOM 和 SAX 方法解析 XML 文件,并通过示例展示了如何动态创建数据库表和处理大量数据的实时插入。 ... [详细]
  • 能够感知你情绪状态的智能机器人即将问世 | 科技前沿观察
    本周科技前沿报道了多项重要进展,包括美国多所高校在机器人技术和自动驾驶领域的最新研究成果,以及硅谷大型企业在智能硬件和深度学习技术上的突破性进展。特别值得一提的是,一款能够感知用户情绪状态的智能机器人即将问世,为未来的人机交互带来了全新的可能性。 ... [详细]
  • 通过使用CIFAR-10数据集,本文详细介绍了如何快速掌握Mixup数据增强技术,并展示了该方法在图像分类任务中的显著效果。实验结果表明,Mixup能够有效提高模型的泛化能力和分类精度,为图像识别领域的研究提供了有价值的参考。 ... [详细]
  • 本文深入探讨了数据库性能优化与管理策略,通过实例分析和理论研究,详细阐述了如何有效提升数据库系统的响应速度和处理能力。文章首先介绍了数据库性能优化的基本原则和常用技术,包括索引优化、查询优化和存储管理等。接着,结合实际应用场景,讨论了如何利用容器化技术(如Docker)来部署和管理数据库,以提高系统的可扩展性和稳定性。最后,文章还提供了具体的配置示例和最佳实践,帮助读者在实际工作中更好地应用这些策略。 ... [详细]
  • 通过将常用的外部命令集成到VSCode中,可以提高开发效率。本文介绍如何在VSCode中配置和使用自定义的外部命令,从而简化命令执行过程。 ... [详细]
  • 浅析python实现布隆过滤器及Redis中的缓存穿透原理_python
    本文带你了解了位图的实现,布隆过滤器的原理及Python中的使用,以及布隆过滤器如何应对Redis中的缓存穿透,相信你对布隆过滤 ... [详细]
  • 本文详细介绍了 Pentaho Kettle 中 RowMetaInterface.writeMeta 方法的使用,并提供了多个代码示例,帮助开发者更好地理解和应用该方法。 ... [详细]
  • 在C语言中,指针的高级应用及其实例分析具有重要意义。通过使用 `&` 符号可以获取变量的内存地址,而 `*` 符号则用于定义指针变量。例如,`int *p;` 定义了一个指向整型的指针变量 `p`。其中,`p` 代表指针变量本身,而 `*p` 则表示指针所指向的内存地址中的内容。此外,指针在不同函数中可以具有相同的变量名,但其作用域和生命周期会有所不同。指针的灵活运用能够有效提升程序的效率和可维护性。 ... [详细]
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社区 版权所有