香橙派--编译MNN报错,关于汇编的嵌套展开

先看报错:

/home/orangepi/MNN-master/source/backend/cpu/arm/arm64/bf16/ARMV86_MNNPackedMatMulRemain_BF16.S:158: Fatal error: macros nested too deeply

再看代码:

PostTreatLH8:FMAX v9, v15, v16, v17, v18FMAX v9, v19, v20, v21, v22FMAX v9, v23, v24, v25, v26FMAX v9, v27, v28, v29, v30FMIN v10, v15, v16, v17, v18FMIN v10, v19, v20, v21, v22FMIN v10, v23, v24, v25, v26FMIN v10, v27, v28, v29, v30

这段代码中使用了多个 FMAX 和 FMIN 函数,它们分别计算一组向量 v15 到 v30 中的最大值和最小值,并将结果存储在两个不同的向量(v9 和 v10)中。具体来说,每个函数接受 5 个向量作为参数,例如:

(1)第一个 FMAX 函数 FMAX v9, v15, v16, v17, v18 计算向量 v15, v16, v17, v18 中的最大值,并将结果存储在 v9 向量中。
(2) 第二个 FMAX 函数 FMAX v9, v19, v20, v21, v22 计算向量 v19, v20, v21, v22 中的最大值,并将结果存储在 v9 向量中。
依此类推,第三个和第四个 FMAX 函数分别计算向量 v23 到 v26 和 v27 到 v30 中的最大值,并将结果存储在 v9 向量中。
类似地,第一个 FMIN 函数 FMIN v10, v15, v16, v17, v18 计算向量 v15, v16, v17, v18 中的最小值,并将结果存储在 v10 向量中。其余的 FMIN 函数依此类推,分别计算各自参数向量中的最小值,并将结果存储在 v10 向量中。

总之,这段代码的作用是计算给定向量组中的最大值和最小值,并将结果存储在两个新的向量中。这些计算通常用于图像处理和机器学习等领域中,以处理和提取特征向量等任务。

启动bf16进行构建时,源码的汇编指令嵌套过深,会导致编译时定义的宏无法展开,这个时候我们需要将指令集中所有关于FMAX和FMIN两个变量的嵌套调用展开,按照以下这种形式修改:

PostTreatLH8:fmax v15.4s, v15.4s, v9.4sfmax v16.4s, v16.4s, v9.4sfmax v17.4s, v17.4s, v9.4sfmax v18.4s, v18.4s, v9.4sfmax v19.4s, v19.4s, v9.4sfmax v20.4s, v20.4s, v9.4sfmax v21.4s, v21.4s, v9.4sfmax v22.4s, v22.4s, v9.4sfmax v23.4s, v23.4s, v9.4sfmax v24.4s, v24.4s, v9.4sfmax v25.4s, v25.4s, v9.4sfmax v26.4s, v26.4s, v9.4sfmax v27.4s, v27.4s, v9.4sfmax v28.4s, v28.4s, v9.4sfmax v29.4s, v29.4s, v9.4sfmax v30.4s, v30.4s, v9.4sfmin v15.4s, v15.4s, v10.4sfmin v16.4s, v16.4s, v10.4sfmin v17.4s, v17.4s, v10.4sfmin v18.4s, v18.4s, v10.4sfmin v19.4s, v19.4s, v10.4sfmin v20.4s, v20.4s, v10.4sfmin v21.4s, v21.4s, v10.4sfmin v22.4g, v22.4s, v10.4sfmin v23.4s, v23.4s, v10.4sfmin v24.4s, v24.4s, v10.4sfmin v25.4s, v25.4s, v10.4sfmin v26.4s, v26.4s, v10.4sfmin v27.4s, v27.4s, v10.4sfmin v28.4s, v28.4s, v10.4sfmin v29.4s, v29.4s, v10.4sfmin v30.4s, v30.4s, v10.4s

接下来看报错:

/home/orangepi/MNN-master/source/backend/cpu/arm/arm64/bf16/ARMV86_MNNPackedMatMul_BF16.S:174: Fatal error: macros nested too deeply

再看代码:

PostTreatLH8:dup v5.4s, w17dup v6.4s, w18FMAX v5, v7, v8, v9, v10FMAX v5, v11, v12, v13, v14FMAX v5, v15, v16, v17, v18FMAX v5, v19, v20, v21, v22FMAX v5, v23, v24, v25, v26FMAX v5, v27, v28, v29, v30FMIN v6, v7, v8, v9, v10FMIN v6, v11, v12, v13, v14FMIN v6, v15, v16, v17, v18FMIN v6, v19, v20, v21, v22FMIN v6, v23, v24, v25, v26

按照以下这种形式修改:

PostTreatLH8:dup v5.4s, w17dup v6.4s, w18fmax v7.4s,  v7.4s,  v5.4sfmax v8.4s,  v8.4s,  v5.4sfmax v9.4s,  v9.4s,  v5.4sfmax v10.4s, v10.4s, v5.4sfmax v11.4s, v11.4s, v5.4sfmax v12.4s, v12.4s, v5.4sfmax v13.4s, v13.4s, v5.4sfmax v14.4s, v14.4s, v5.4sfmax v15.4s, v15.4s, v5.4sfmax v16.4s, v16.4s, v5.4sfmax v17.4s, v17.4s, v5.4sfmax v18.4s, v18.4s, v5.4sfmax v19.4s, v19.4s, v5.4sfmax v20.4s, v20.4s, v5.4sfmax v21.4s, v21.4s, v5.4sfmax v22.4s, v22.4s, v5.4sfmax v23.4s, v23.4s, v5.4sfmax v24.4s, v24.4s, v5.4sfmax v25.4s, v25.4s, v5.4sfmax v26.4s, v26.4s, v5.4sfmax v27.4s, v27.4s, v5.4sfmax v28.4s, v28.4s, v5.4sfmax v29.4s, v29.4s, v5.4sfmax v30.4s, v30.4s, v5.4sfmin v7.4s,  v7.4s,  v6.4sfmin v8.4s,  v8.4s,  v6.4sfmin v9.4s,  v9.4s,  v6.4sfmin v10.4s, v10.4s, v6.4sfmin v11.4s, v11.4s, v6.4sfmin v12.4s, v12.4s, v6.4sfmin v13.4s, v13.4s, v6.4sfmin v14.4s, v14.4s, v6.4sfmin v15.4s, v15.4s, v6.4sfmin v16.4s, v16.4s, v6.4sfmin v17.4s, v17.4s, v6.4sfmin v18.4s, v18.4s, v6.4sfmin v19.4s, v19.4s, v6.4sfmin v20.4s, v20.4s, v6.4sfmin v21.4s, v21.4s, v6.4sfmin v22.4s, v22.4s, v6.4sfmin v23.4s, v23.4s, v6.4sfmin v24.4s, v24.4s, v6.4sfmin v25.4s, v25.4s, v6.4sfmin v26.4s, v26.4s, v6.4s

这段代码使用了 ARM 架构中的向量寄存器(例如 v7.4s 和 v5.4s),它们可以同时存储多个浮点数或整数,并且通常用于图像处理和机器学习等领域。其中,FMAX 和 FMIN 函数分别用来计算一组向量中的最大值和最小值,并将结果存储在新的向量中。

具体来说,该代码首先使用 DUP 函数将标量 w17 和 w18 复制到向量 v5.4s 和 v6.4s 中。然后,它调用了 6 次 FMAX 函数和 5 次 FMIN 函数,每次传递 4 个向量参数。这意味着该代码实际上是将 24 个向量中的最大值和最小值分别存储在 v5.4s 和 v6.4s 中。

总之,该代码使用向量计算来高效地计算一组向量中的最大值和最小值,并且通过重复调用 FMAX 和 FMIN 函数来处理多个向量。这种方法可以在某些情况下比传统的循环方式更快,并且可以充分利用现代 CPU 的并行计算能力。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/618089.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

缓存学习实战篇

缓存练习题&#xff08;用户查询操作&#xff09; public List<ShopType> queryAllType() throws JsonProcessingException {//从缓存中查数据String shopTypeJson stringRedisTemplate.opsForValue().get("cache:shopType");//如果缓存命中&#xff0c;if (S…

1.7用REST API实现dynv6脚本(上)

专栏导航 第六章 用命令得到ip和域名解析<网络> 第七章 用REST API实现dynv6脚本(上) ⇐ 第八章 用REST API实现dynv6脚本(下) 用折腾路由的兴趣,顺便入门shell编程。 文章目录 专栏导航前言一、正则表达式基础二、梅林自定义ddns-start1、API选择2、流程图三、代码实…

申请ZeroSSL泛域名域名证书 并部署阿里云测试

安装acme.sh 安装过程中可能会失败 多试几次就会成功 wget -O - https://raw.githubusercontent.com/acmesh-official/acme.sh/master/acme.sh | sh -s -- --install-online -m 你的邮箱gmail.com安装完成后重新加载 Bash&#xff1a; source ~/.bashrc然后也可以开启自动更…

客户端请求服务器的步骤

当我们在浏览器地址栏输入’http://www.xxx.com/api/xxx"时&#xff0c;客户端是如何找到服务器并发送请求的&#xff1f; 1.先找到服务器 a.检测浏览器缓存有没有缓存该域名对应的IP地址&#xff0c;有则通过IP地址取找服务器。 b.检测本地的hosts文件&#xff0c;是否有…

FPGA 高端项目:基于 SGMII 接口的 UDP 协议栈,提供2套工程源码和技术支持

目录 1、前言免责声明 2、相关方案推荐我这里已有的以太网方案本协议栈的 1G-UDP版本本协议栈的 10G-UDP版本本协议栈的 25G-UDP版本1G 千兆网 TCP-->服务器 方案1G 千兆网 TCP-->客户端 方案10G 万兆网 TCP-->服务器客户端 方案 3、该UDP协议栈性能4、详细设计方案设…

NX二次开发PK获取对象类型

PK_ENTITY_ask_class(),获取对象类型建议用这个函数&#xff0c;比较通用&#xff0c;包含所有对象类型&#xff0c;可以替代UF_MODL_ask_edge_type(),UF_MODL_ask_body_type(),UF_MODL_ask_face_type()等函数 PK_ENTITY_t entity; PK_CLASS_t PK_TYPE; PK_ENTITY_ask_class(e…

Dapper-OracleSQLHelper 通用封装

/// <summary> /// Oracle Help 封装使用 /// </summary> /// <typeparam name"T"></typeparam> public class OracleSQLDapperHelper<T> where T : class { /// <summary> /// 数据库连接…

openAI API key不需要中转,自己就可以使用正版

很多小伙伴因为不知道怎么使用原版&#xff0c;用的都是国内套壳的&#xff0c;国内套壳的有些价格不合适&#xff0c;如何是3.5的话只需要绑定虚拟信用卡就可以使用 想使用openai API key4.0的话你需要先开通ChatGPTplus&#xff0c;在绑定openai API key&#xff0c;绑定ope…

Spring事务失效场景之类内部方法调用及解决方案

一、背景 在日常开发中&#xff0c;经常有需要使用事务来保证数据一致性的情况。简单点的话直接在方法上面加Transactional注解就可以了。 但这样存在一个问题&#xff0c;在整个业务方法层面加注解会把很多并不需要归入事务的操作也归入到了事务里面&#xff0c;这样会可能会…

算法第十七天-构造有效字符串的最少插入数

构造有效字符串的最少插入数 题目要求 解题思路 考虑abc的个数 假设答案有n个"abc"组成&#xff0c;那么需要插入的字符个数为 3 ∗ n − l e n ( s ) 3*n - len(s) 3∗n−len(s)。 对于相邻的两个字符x和y&#xff08;x在y左侧&#xff09;&#xff1a; 如果 x…

OCR字符识别:开始批量识别身份证信息

身份证信息批量识别OCR是一项解决方案&#xff0c;它能够将身份证照片打包成zip格式或通过URL地址进行提交&#xff0c;并能够识别照片中的文本信息。最终&#xff0c;用户可以将识别结果生成为excel文件进行下载。 API接口功能&#xff1a; 1. 批量识别&#xff1a;支持将多…

【面试合集】2.说说微信小程序的生命周期函数有哪些?

面试官&#xff1a;说说微信小程序的生命周期函数有哪些&#xff1f; 一、是什么 跟vue、react框架一样&#xff0c;微信小程序框架也存在生命周期&#xff0c;实质也是一堆会在特定时期执行的函数 小程序中&#xff0c;生命周期主要分成了三部分&#xff1a; 应用的生命周期…

2023-12-02青少年软件编程(Python语言)等级考试试卷(六级)解析

2023-12-02青少年软件编程(Python语言)等级考试试卷(六级)解析一、单选题(共25题,共50分) 1.运行以下程序,输出的结果是?(D) class A(): def __init__(self,x): self.x=x+1 def b(self): return self.x*self.x t=A(3) print(t.b()) A. 9 B. 12…

【详解】结构体的内存对齐(每步配图)

目录 引言&#xff1a; 为什么存在结构体内存对齐? 结构体内存对齐规则&#xff1a; 练习一&#xff1a; 测试代码&#xff1a; 结果如下&#xff1a; 第二个练习&#xff1a;结构体的嵌套问题 测试代码&#xff1a; 代码结果如下&#xff1a; 两个关于结构体的易错…

GO-掌握代码的灵活之道:探索反射、接口和函数回调的替代方案

GO-掌握代码的灵活之道&#xff1a;探索反射、接口和函数回调的替代方案 Go语言提供了反射&#xff08;reflection&#xff09;的机制&#xff0c;使得程序在运行时可以动态地检查类型信息、调用方法和修改变量的值。反射在一些需要处理未知类型的情况下非常有用&#xff0c;比…

【JUC】JAVA线程小结

Java线程 前言——阅读10-20分钟&#x1f386;1.创建和运行线程ThreadRunableFutureTask多个线程运行方式 &#x1f4e3;2.不同操作系统查看进程线程的方法windowslinuxJava命令行 &#x1f680;3.java线程运行原理栈与栈帧线程上下文切换&#xff08;Thread Context Switch&am…

突然就爆火了!一张“旧纸”卖45元,这是什么操作?

没想到&#xff0c;一张“旧纸”竟然能卖到45元&#xff01;这可真是让人大跌眼镜。最近&#xff0c;有网友发现2024年的公历日历和1996年的完全一样。于是&#xff0c;网络上就掀起了一股“买本旧日历过新年”的热潮。那些挂出1996年老日历的卖家们&#xff0c;简直就像捡到了…

《 乱弹篇(二)》

题记 昨&#xff08;2024年1月12日&#xff09;天&#xff0c;既然笔者因感到写时评文力不从心&#xff0c;新辟一专栏《乱弹篇》&#xff0c;开始了“ 东西南北&#xff0c;古今中外&#xff0c;谈而不乱&#xff0c;抒怀而已”的写作路径&#xff0c;就要走下去&#xff0c;…

Windows使用(版本8.11)ElasticSearch、elasticsearch-head、kibana

下载安装引用这篇文章 目录 1、ES基本知识核心术语核心概念倒排索引ES字典树ES怎么保证读写一致 2、Window启动ES步骤elasticsearch-8.11.3elasticsearch-head-masterkibana-8.11.3 3、Kibana 调用ES API示例 1、ES基本知识 核心术语 ● 索引&#xff1a;index &#xff08;相…

Debezium发布历史64

原文地址&#xff1a; https://debezium.io/blog/2019/07/12/streaming-cassandra-at-wepay-part-1/ 欢迎关注留言&#xff0c;我是收集整理小能手&#xff0c;工具翻译&#xff0c;仅供参考&#xff0c;笔芯笔芯. 在 WePay 上流式传输 Cassandra - 第 1 部分 七月 12, 2019 …