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

2024-01-13 13:44

本文主要是介绍香橙派--编译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 的并行计算能力。

这篇关于香橙派--编译MNN报错,关于汇编的嵌套展开的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/601669

相关文章

idea突然报错Malformed \uxxxx encoding问题及解决

《idea突然报错Malformeduxxxxencoding问题及解决》Maven项目在切换Git分支时报错,提示project元素为描述符根元素,解决方法:删除Maven仓库中的resolv... 目www.chinasem.cn录问题解决方式总结问题idea 上的 maven China编程项目突然报错,是

linux查找java项目日志查找报错信息方式

《linux查找java项目日志查找报错信息方式》日志查找定位步骤:进入项目,用tail-f实时跟踪日志,tail-n1000查看末尾1000行,grep搜索关键词或时间,vim内精准查找并高亮定位,... 目录日志查找定位在当前文件里找到报错消息总结日志查找定位1.cd 进入项目2.正常日志 和错误日

解决升级JDK报错:module java.base does not“opens java.lang.reflect“to unnamed module问题

《解决升级JDK报错:modulejava.basedoesnot“opensjava.lang.reflect“tounnamedmodule问题》SpringBoot启动错误源于Jav... 目录问题描述原因分析解决方案总结问题描述启动sprintboot时报以下错误原因分析编程异js常是由Ja

解决Nginx启动报错Job for nginx.service failed because the control process exited with error code问题

《解决Nginx启动报错Jobfornginx.servicefailedbecausethecontrolprocessexitedwitherrorcode问题》Nginx启... 目录一、报错如下二、解决原因三、解决方式总结一、报错如下Job for nginx.service failed bec

详解Java中三种状态机实现方式来优雅消灭 if-else 嵌套

《详解Java中三种状态机实现方式来优雅消灭if-else嵌套》这篇文章主要为大家详细介绍了Java中三种状态机实现方式从而优雅消灭if-else嵌套,文中的示例代码讲解详细,感兴趣的小伙伴可以跟... 目录1. 前言2. 复现传统if-else实现的业务场景问题3. 用状态机模式改造3.1 定义状态接口3

Java报错:org.springframework.beans.factory.BeanCreationException的五种解决方法

《Java报错:org.springframework.beans.factory.BeanCreationException的五种解决方法》本文解析Spring框架中BeanCreationExce... 目录引言一、问题描述1.1 报错示例假设我们有一个简单的Java类,代表一个用户信息的实体类:然后,

解决若依微服务框架启动报错的问题

《解决若依微服务框架启动报错的问题》Invalidboundstatement错误通常由MyBatis映射文件未正确加载或Nacos配置未读取导致,需检查XML的namespace与方法ID是否匹配,... 目录ruoyi-system模块报错报错详情nacos文件目录总结ruoyi-systnGLNYpe

kkFileView启动报错:报错2003端口占用的问题及解决

《kkFileView启动报错:报错2003端口占用的问题及解决》kkFileView启动报错因office组件2003端口未关闭,解决:查杀占用端口的进程,终止Java进程,使用shutdown.s... 目录原因解决总结kkFileViewjavascript启动报错启动office组件失败,请检查of

Go语言编译环境设置教程

《Go语言编译环境设置教程》Go语言支持高并发(goroutine)、自动垃圾回收,编译为跨平台二进制文件,云原生兼容且社区活跃,开发便捷,内置测试与vet工具辅助检测错误,依赖模块化管理,提升开发效... 目录Go语言优势下载 Go  配置编译环境配置 GOPROXYIDE 设置(VS Code)一些基本

解决1093 - You can‘t specify target table报错问题及原因分析

《解决1093-Youcan‘tspecifytargettable报错问题及原因分析》MySQL1093错误因UPDATE/DELETE语句的FROM子句直接引用目标表或嵌套子查询导致,... 目录报js错原因分析具体原因解决办法方法一:使用临时表方法二:使用JOIN方法三:使用EXISTS示例总结报错原