MNN 执行推理(九)
系列文章目录
MNN createFromBuffer(一)
MNN createRuntime(二)
MNN createSession 之 Schedule(三)
MNN createSession 之创建流水线后端(四)
MNN Session 之维度计算(五)
MNN Session 之几何计算(六)
MNN Session 之 CPU 算子(七)
MNN Session 之 Vulkan 算子(八)
MNN 执行推理(九)
文章目录
- 系列文章目录
- 1、Interpreter::runSession
- 1.1 Session::run
- 1.1.1 Pipeline::execute
- 1.1.1.1 VulkanBackend::onExecuteBegin
- 1.1.1.2 Execution::onExecute
- 1.1.1.3 Backend::onExecuteEnd
- 1.1.1.3.1 _finish
1、Interpreter::runSession
// source/core/Interpreter.cpp
ErrorCode Interpreter::runSession(Session* session) const {std::unique_lock<std::mutex> _l(mNet->lock);
#ifdef MNN_INTERNAL_ENABLEDTimer timer;
#endifErrorCode errorcode = session->run();#ifdef MNN_INTERNAL_ENABLEDif (shouldLog(FREQ_LOW)) {waitSessionFinish(session);float costTime = (float)timer.durationInUs() / (float)1000;logForRunSession(session, costTime, "Interpreter::runSession");}
#endif // MNN_INTERNAL_ENABLEDreturn errorcode;
}
1.1 Session::run
Pipeline
// source/core/Session.cpp
ErrorCode Session::run() const {if (mNeedResize) {MNN_ERROR("Can't run session because not resized\n");return COMPUTE_SIZE_ERROR;}// mPipelines 类型为 std::vector<std::shared_ptr<Pipeline>>for (auto& iter : mPipelines) {auto error = iter->execute();if (NO_ERROR != error) {return error;}}return NO_ERROR;
}
1.1.1 Pipeline::execute
OpCacheInfo 、BackendCache、Command、CommandBuffer
// source/core/Pipeline.cpp
// typedef std::pair<BackendCache, std::vector<OpCacheInfo>> PipelineInfo
ErrorCode Pipeline::execute() {_copyInputs();auto& mBackend = mInfo.first.cache.first;auto& mBackupBackend = mInfo.first.cache.second;mBackend->onExecuteBegin();// mInfo 类型为 std::pair<BackendCache, std::vector<OpCacheInfo>>for (auto& info : mInfo.second) {auto& buffer = info.executeBuffer;
//#define LOG_VERPOSE
#ifdef LOG_VERPOSEFUNC_PRINT_ALL(info.op->name()->c_str(), s);
#endiffor (auto& cmdP : buffer.command) {auto& cmd = *cmdP;auto code = cmd.execution->onExecute(cmd.workInputs, cmd.workOutputs);
// #define LOG_VERPOSE
#ifdef LOG_VERPOSEauto dumpT = [](Tensor* t) {auto size = TensorUtils::getRawSize(t);size = size > 10 ? 10 : size;if (t->getType() == halide_type_of<float>()) {for (int i=0; i<size; ++i) {MNN_PRINT("%f, ", t->host<float>()[i]);}} else {for (int i=0; i<size; ++i) {MNN_PRINT("%d, ", t->host<int>()[i]);}}MNN_PRINT("\n");};if (/* cmd.op->name() && cmd.op->name()->str() == "/embed/embed_/Gather_output_0"*/cmd.op->type() == OpType_Convolution) {MNN_PRINT("%s Input begin:\n", EnumNameOpType(cmd.op->type()));for (auto t : cmd.workInputs) {dumpT(t);}MNN_PRINT("%s Output begin:\n", EnumNameOpType(cmd.op->type()));for (auto t : cmd.workOutputs) {dumpT(t);}}
#endifif (NO_ERROR != code) {mBackend->onExecuteEnd();return code;}}}mBackend->onExecuteEnd();return NO_ERROR;
}
1.1.1.1 VulkanBackend::onExecuteBegin
在函数 Pipeline::execute 中调用 Backend::onExecuteBegin 函数的代码如下:
mBackend->onExecuteBegin();
onExecuteBegin 函数是个虚函数, mBackend->onExecuteBegin 调用是个多态,其基类为 Backend,此处 mBackend 为 VulkanBackend,其具体实现代码如下:
// source/backend/vulkan/image/backend/VulkanBackend.cpp
void VulkanBackend::onExecuteBegin() const {if (!mDirect) {mCmdBuffers.push_back(mCmdBuffer->get());}// FUNC_PRINT_ALL(mDynamicMemoryPool->computeSize(), f);
}
VulkanBasicExecutionDirect::onExecute
1.1.1.2 Execution::onExecute
在函数 Pipeline::execute 中调用 Execution::onExecute 函数的代码如下:
auto code = cmd.execution->onExecute(cmd.workInputs, cmd.workOutputs);
Execution::onExecute 函数是个虚函数,对于 Vulkan 来说,主要有 VulkanBasicExecutionDirect 和 VulkanBasicExecutionInDirect,我们以 VulkanBasicExecutionDirect 进行分析:
// source/backend/vulkan/image/execution/VulkanBasicExecution.cpp
ErrorCode VulkanBasicExecutionDirect::onExecute(const std::vector<Tensor *> &inputs, const std::vector<Tensor *> &outputs) {auto extra = static_cast<VulkanBackend *>(backend());extra->pushCommand(mCmdBuffer->get());return NO_ERROR;
}
1.1.1.3 Backend::onExecuteEnd
在函数 Pipeline::execute 中调用 Backend::onExecuteEnd 函数的代码如下:
mBackend->onExecuteEnd();
Backend::onExecuteEnd 函数是个虚函数,对于 Vulkan 来说为 VulkanBackend ,以下为其代码:
// source/backend/vulkan/image/backend/VulkanBackend.cpp
void VulkanBackend::onExecuteEnd() const {_finish();
}
1.1.1.3.1 _finish
// source/backend/vulkan/image/backend/VulkanBackend.cpp
void VulkanBackend::_finish() const {if (mCmdBuffers.empty()) {return;}VkSubmitInfo submit_info = {/* .sType = */ VK_STRUCTURE_TYPE_SUBMIT_INFO,/* .pNext = */ nullptr,/* .waitSemaphoreCount = */ 0,/* .pWaitSemaphores = */ nullptr,/* .pWaitDstStageMask = */ nullptr,/* .commandBufferCount = */ (uint32_t)mCmdBuffers.size(),/* .pCommandBuffers = */ mCmdBuffers.data(),/* .signalSemaphoreCount = */ 0,/* .pSignalSemaphores = */ nullptr};auto fenceReal = mFence->get();mFence->reset();CALL_VK(vkQueueSubmit(device().acquireDefaultDevQueue(), 1, &submit_info, fenceReal));auto res = mFence->wait();MNN_VK_CHECK(res);mCmdBuffers.clear();
}
☆
相关文章:

MNN 执行推理(九)
系列文章目录 MNN createFromBuffer(一) MNN createRuntime(二) MNN createSession 之 Schedule(三) MNN createSession 之创建流水线后端(四) MNN Session 之维度计算(五…...

算法公式汇总
文章目录 三角函数定义式诱导公式平方关系两角和与差的三角函数积化和差公式和差化积公式倍角公式半角公式万能公式其他公式反三角函数恒等式 三角函数定义式 三角函数 定义式 余切: c o t A 1 t a n A \text { 余切:} \ cotA \frac{1}{tanA} 余切&a…...
c语言管理课程信息系统
定制魏:QTWZPW,获取更多源码等 目录 题目要求 数据结构 函数设计 结构设计 管理员功能: 学生功能: 效果展示 总结 主函数代码 题目要求 管理课程信息系统,允许管理员和学生执行不同的操作。管理员可以添加、浏览、查询、删除、修改和排序课程信息。学生可以…...
大模型在天体物理学研究中的辅助作用与案例分析
大模型在天体物理学研究中的辅助作用与案例分析 1. 背景介绍 天体物理学是研究宇宙中各种天体的物理性质和运动规律的科学。随着观测技术的进步,天体物理学家们获得了大量的数据,这些数据往往具有高维度、非线性、非平稳等特点,给传统的数据…...

洛谷_P1873 [COCI 2011/2012 #5] EKO / 砍树_python写法
P1873 [COCI 2011/2012 #5] EKO / 砍树 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) n, m map(int,input().split())data list(map(int,input().split())) h 0 def check(mid):h 0for i in data:if i>mid:h (i-mid)if h < m:return Trueelse:return Falsel 0 r …...
Android_NDK调试
第一步: 链接log动态库 在Android.mk文件中添加 LOCAL_LDLIBS -llog 注意:一定要在 include $(BUILD_SHARED_LIBRARY) 之上添加,因为当执行到这句话的时候就表示所有的lib动态库已经加载完毕了,所以当你在这句代码之后再添加…...
全量知识系统 概要设计(SmartChat回复)
以下是根据我给出的 系统概要 “提要和纪要”,SmartChat给出的概要设计。我给出的“提要和纪要”可参考链接: https://blog.csdn.net/ChuanfangChen/article/details/136861822 -------------------------------- 概要设计文档 1. 简介 全量知识系统…...

一、SpringBoot基础搭建
本教程主要给初学SpringBoot的开发者,通过idea搭建单体服务提供手把手教学例程,主要目的在于理解环境的搭建,以及maven模块之间的整合与调用 源码:jun/learn-springboot 以商城项目为搭建例子,首先计划建1个父模块&…...

some/ip CAN CANFD
关于SOME/IP的理解 在CAN总线的车载网络中,通信过程是面向信号的 当ECU的信号的值发生了改变,或者发送周期到了,就会发送消息,而不考虑接收者是否需要,这样就会造成总线上出现不必要的信息,占用了带宽 …...
HTTP Header Fields
HTTP(超文本传输协议)中包含多种类型的头部字段(Header Fields),以下是常见的HTTP头部字段及其作用: ### 通用头字段(General Header Fields) - **Cache-Control**: 控制缓存行为&a…...

基于FPGA的FFT图像滤波设计
1.FFT滤波算法介绍 FFT滤波就是通过傅里叶运算将图像转换到频域空间,然后在频域中对图像进行处理,最后将处理后的图像通过傅里叶逆运算将图像转会到时域空间。 在频域空间中,我们能够更好的对图像的噪声进行分析,然后找出相关规律…...

WPF 立体Border
WPF 立体Border ,用来划分各个功能区块 在资源文件中,添加如下样式代码: <Style x:Key"BaseBorder" TargetType"Border"><Setter Property"Background" Value"White" /><Setter Prop…...

java.lang.ClassNotFoundException: kotlin.jvm.internal.Intrinsics
今天在使用springBoot连接influxdb报错 java.lang.ClassNotFoundException: kotlin.jvm.internal.Intrinsics 详细报错如下,提出我们缺少一个依赖 原因是由于创建influxdb客户端缺少Kotlin运行时库 解决办法就是 1.显示的添加okhttp的依赖 <dependency>…...

代码随想录(day8)——字符串
Leetcode.344 反转字符串: 344. 反转字符串 - 力扣(LeetCode) 原理过于简单,没什么好说的,直接给出代码: class Solution { public:void reverseString(vector<char>& s) {int end s.size()-1…...

JavaScript 权威指南第七版(GPT 重译)(二)
第四章:表达式和运算符 本章记录了 JavaScript 表达式以及构建许多这些表达式的运算符。表达式 是 JavaScript 的短语,可以 评估 以产生一个值。在程序中直接嵌入的常量是一种非常简单的表达式。变量名也是一个简单表达式,它评估为分配给该变…...

【python_往企业微信群中发送文件】
python_往企业微信群中发送文件 这个是用企业微信群机器人的功能,没有用到后台应用。群机器人 #-*- coding:utf-8-* import requests#类型:voice,file file_type"file" file_path"D:\desktop\不过.jpg" webhookkey"xxxx"#…...
华为校招机试 - 循环依赖(20240320)
题目描述 给定一组元素,及其依赖关系,一个元素可以依赖于多个元素(不包括自己,被依赖元素不会重复),一个元素也可被多个元素依赖。 假定总是存在唯一的循环依赖,请输出该循环依赖。 输入描述 第一行是个正整数 N (1 < N < 100),表示依赖关系的个数。 下面每…...

基于Spring Boot技术的幼儿园管理系统
摘 要 随着信息时代的来临,过去的传统管理方式缺点逐渐暴露,对过去的传统管理方式的缺点进行分析,采取计算机方式构建幼儿园管理系统。本文通过课题背景、课题目的及意义相关技术,提出了一种活动信息、课程信息、菜谱信息、通知公…...

查找众数及中位数 - 华为OD统一考试(C卷)
OD统一考试(C卷) 分值: 100分 题解: Java / Python / C++ 题目描述 众数是指一组数据中出现次数量多的那个数,众数可以是多个。 中位数只是指把一组数据从小到大排列,最中间的那个数,如果这组数据的个数是奇数,那最中间那个就是中位数,如果这组数据的个数为偶数,那…...

bash命令执行.sh文件 windows python环境
报错: bash : 无法将“bash”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。 所在位置 行:1 字符: 1 ’ bash fetch_data.sh ‘ ~~~~ CategoryInfo : Object…...
C++:std::is_convertible
C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...
【Linux】C语言执行shell指令
在C语言中执行Shell指令 在C语言中,有几种方法可以执行Shell指令: 1. 使用system()函数 这是最简单的方法,包含在stdlib.h头文件中: #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...
电脑插入多块移动硬盘后经常出现卡顿和蓝屏
当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时,可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案: 1. 检查电源供电问题 问题原因:多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...

html-<abbr> 缩写或首字母缩略词
定义与作用 <abbr> 标签用于表示缩写或首字母缩略词,它可以帮助用户更好地理解缩写的含义,尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时,会显示一个提示框。 示例&#x…...
iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈
在日常iOS开发过程中,性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期,开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发,但背后往往隐藏着系统资源调度不当…...

使用LangGraph和LangSmith构建多智能体人工智能系统
现在,通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战,比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...

ubuntu22.04有线网络无法连接,图标也没了
今天突然无法有线网络无法连接任何设备,并且图标都没了 错误案例 往上一顿搜索,试了很多博客都不行,比如 Ubuntu22.04右上角网络图标消失 最后解决的办法 下载网卡驱动,重新安装 操作步骤 查看自己网卡的型号 lspci | gre…...
第八部分:阶段项目 6:构建 React 前端应用
现在,是时候将你学到的 React 基础知识付诸实践,构建一个简单的前端应用来模拟与后端 API 的交互了。在这个阶段,你可以先使用模拟数据,或者如果你的后端 API(阶段项目 5)已经搭建好,可以直接连…...

如何做好一份技术文档?从规划到实践的完整指南
如何做好一份技术文档?从规划到实践的完整指南 🌟 嗨,我是IRpickstars! 🌌 总有一行代码,能点亮万千星辰。 🔍 在技术的宇宙中,我愿做永不停歇的探索者。 ✨ 用代码丈量世界&…...