香橙派--编译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

相关文章

Pycharm安装报错:Cannot detect a launch configuration解决办法

《Pycharm安装报错:Cannotdetectalaunchconfiguration解决办法》本文主要介绍了Pycharm安装报错:Cannotdetectalaunchconfigur... 本文主要介绍了Pycharm安装报错:Cannot detect a launch configuratio

Java嵌套for循环优化方案分享

《Java嵌套for循环优化方案分享》介绍了Java中嵌套for循环的优化方法,包括减少循环次数、合并循环、使用更高效的数据结构、并行处理、预处理和缓存、算法优化、尽量减少对象创建以及本地变量优化,通... 目录Java 嵌套 for 循环优化方案1. 减少循环次数2. 合并循环3. 使用更高效的数据结构4

IDEA编译报错“java: 常量字符串过长”的原因及解决方法

《IDEA编译报错“java:常量字符串过长”的原因及解决方法》今天在开发过程中,由于尝试将一个文件的Base64字符串设置为常量,结果导致IDEA编译的时候出现了如下报错java:常量字符串过长,... 目录一、问题描述二、问题原因2.1 理论角度2.2 源码角度三、解决方案解决方案①:StringBui

Python Jupyter Notebook导包报错问题及解决

《PythonJupyterNotebook导包报错问题及解决》在conda环境中安装包后,JupyterNotebook导入时出现ImportError,可能是由于包版本不对应或版本太高,解决方... 目录问题解决方法重新安装Jupyter NoteBook 更改Kernel总结问题在conda上安装了

Python安装时常见报错以及解决方案

《Python安装时常见报错以及解决方案》:本文主要介绍在安装Python、配置环境变量、使用pip以及运行Python脚本时常见的错误及其解决方案,文中介绍的非常详细,需要的朋友可以参考下... 目录一、安装 python 时常见报错及解决方案(一)安装包下载失败(二)权限不足二、配置环境变量时常见报错及

MySQL报错sql_mode=only_full_group_by的问题解决

《MySQL报错sql_mode=only_full_group_by的问题解决》本文主要介绍了MySQL报错sql_mode=only_full_group_by的问题解决,文中通过示例代码介绍的非... 目录报错信息DataGrip 报错还原Navicat 报错还原报错原因解决方案查看当前 sql mo

解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题

《解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题》文章详细描述了在使用lombok的@Data注解标注实体类时遇到编译无误但运行时报错的问题,分析... 目录问题分析问题解决方案步骤一步骤二步骤三总结问题使用lombok注解@Data标注实体类,编译时

linux报错INFO:task xxxxxx:634 blocked for more than 120 seconds.三种解决方式

《linux报错INFO:taskxxxxxx:634blockedformorethan120seconds.三种解决方式》文章描述了一个Linux最小系统运行时出现的“hung_ta... 目录1.问题描述2.解决办法2.1 缩小文件系统缓存大小2.2 修改系统IO调度策略2.3 取消120秒时间限制3

Spring常见错误之Web嵌套对象校验失效解决办法

《Spring常见错误之Web嵌套对象校验失效解决办法》:本文主要介绍Spring常见错误之Web嵌套对象校验失效解决的相关资料,通过在Phone对象上添加@Valid注解,问题得以解决,需要的朋... 目录问题复现案例解析问题修正总结  问题复现当开发一个学籍管理系统时,我们会提供了一个 API 接口去

解决systemctl reload nginx重启Nginx服务报错:Job for nginx.service invalid问题

《解决systemctlreloadnginx重启Nginx服务报错:Jobfornginx.serviceinvalid问题》文章描述了通过`systemctlstatusnginx.se... 目录systemctl reload nginx重启Nginx服务报错:Job for nginx.javas