ARM嵌入式编译之循环操作(LOOP)优化

news2025/1/11 14:08:30

取决于循环的迭代次数,完成循环可能需要花费大量时间,此外,每次迭代时,需要判断循环条件是否成立,这一操作也会降低循环的性能。

1 循环展开-Loop unrolling

为了减少每次循环都需要判断迭代条件带来的性能影响,用户可以将循环展开,以减少判断循环条件的次数。使用 #pragma unroll (<n>)  来展开用户代码中对时间、性能比较敏感的循环。然而,将循环展开也有一个缺点:增加了代码量。下表中的操作仅对 -O2-O3-Ofast, 以及-Omax优化时有效果:

Loop unrolling pragmas
PragmaDescription
#pragma unroll (<n>)展开循环的 n 次迭代
#pragma unroll_completely展开循环中的所有迭代

具体的使用方法见:
#pragma unroll[(n)], #pragma unroll_completelyhttps://developer.arm.com/documentation/101754/0620/armclang-Reference/Compiler-specific-Pragmas/-pragma-unroll--n-----pragma-unroll-completely 需要注意的是:手动在源代码中将循环展开和使用 #pragma unroll (<n>) 的效果是不一样的,手动在源代码中展开循环可能会阻碍编译器对循环的优化操作,ARM建议用户使用 #pragma unroll (<n>) 。如果没有指定 展开的迭代次数 n, 将默认展开循环中的所有迭代。此外,如果编译器无法计算出迭代的次数,使用#pragma unroll_completely,在编译时将不会进行循环展开。

比如有以下示例代码:

int countSetBits1(unsigned int n)
{
    int bits = 0;

    while (n != 0)
    {
        if (n & 1) bits++;
        n >>= 1;
    }
    return bits;
}

使用如下命令进行编译:

armclang --target=arm-arm-none-eabi -march=armv8-a file.c -O2 -S -o file.s

 默认情况下,将得到如下汇编代码:

countSetBits1:
        mov     r1, r0
        mov     r0, #0
        cmp     r1, #0
        bxeq    lr
        mov     r2, #0
        mov     r0, #0
.LBB0_1:
        and     r3, r1, #1
        cmp     r2, r1, asr #1
        add     r0, r0, r3
        lsr     r3, r1, #1
        mov     r1, r3
        bne     .LBB0_1
        bx      lr

如果使用循环展开,

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

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

相关文章

chatgpt赋能Python-20210712用python提取年月日

使用Python实现年月日的提取 在进行数据分析或开发中&#xff0c;提取年月日信息是非常重要的一项任务。而Python作为一门优秀的编程语言&#xff0c;其内置的多种库和函数可以帮助我们快速且高效地实现这一任务。本篇文章将会介绍使用Python提取年月日的方法以及注意事项。 …

串口与4g模块

1.认识4G模块 1、接线与插卡&#xff1a;EC03-DNC4G通信模块&#xff0c;生产的公司是EBYTE&#xff08;亿佰特&#xff09;。官网上有软件和用户手册下载地址。 保证插卡不插错&#xff0c;一是使用SIM卡卡套&#xff0c;二是方向保证正确。如图位置是SIM卡状态灯&#xff0…

Trie树

目录 一、Tire树的概念二、Trie树的应用Trie字符串统计最大异或对&#xff08;难点&#xff09;暴力遍历法Trie树优化法 一、Tire树的概念 Trie树又称字典树、单词查找树。是一种能够高效存储和查找字符串集合的数据结构。 示例&#xff1a; 利用Tire树的数据结构储存字符串 储…

跟庄买股票得新技巧(第三弹)集合竞价战法

尾盘抢筹&#xff08;参考昨天&#xff09; 57分 12.35 收盘价 12.42 股价明显上涨&#xff08;越大越好&#xff09;全天阳线&#xff0c;否则突然变高就有作线的嫌疑12.35到12.42&#xff0c;滞留大量为成交单&#xff08;买一到买十存在大量买单&#xff0c;否则有做线嫌疑…

Spring-boot 结合Thymeleaf--拦截器--文件上传

目录 Spring-boot 结合Thymeleaf 官方文档 基本介绍 ● Thymeleaf 是什么 ● Thymeleaf 的优点 ● Thymeleaf 的缺点 ● Thymeleaf 机制说明 Thymeleaf 语法 表达式 1. 表达式一览 2.字面量 3. 文本操作 4.运算符 3. 比较运算 4. 条件运算 th 属性 迭代 条件运…

4年经验面试要15K,一问自动化却以为我在刁难他?

我这次是公司招聘的面试官之一&#xff0c;主要负责一些技术上的考核&#xff0c;这段时间还真让我碰到了不少奇葩求职者 昨天公司的HR小席刚跟我吐槽&#xff1a;这个星期没有哪天不加班的&#xff01;各种招聘网站上的消息源源不断&#xff0c;连吃饭都要回消息…… 看来最…

【Java面试】JVM垃圾回收相关知识点

文章目录 1. Java中对象有哪些引用类型&#xff1f;2. 有哪些基本的垃圾回收算法&#xff1f;3. 什么是分区收集算法&#xff1f;和分代收集什么区别&#xff1f;4. 什么是Minor GC、Major GC、Full GC?5. 什么情况下会触发Full GC&#xff1f; 1. Java中对象有哪些引用类型&a…

Linux 常用指令的使用

文章目录 1. 基础命令1&#xff09;ls2&#xff09;pwd3&#xff09;cd4&#xff09;touch5&#xff09;cat6&#xff09;mkdir7&#xff09;rm8&#xff09;cp9&#xff09;mv10&#xff09;more11&#xff09;less12&#xff09;head13&#xff09;tail14&#xff09;vim15&a…

《论文阅读》常识推理的生成知识提示

《论文阅读》常识推理的生成知识提示 前言简介相关知识模型构架Generated Knowledge PromptingKnowledge GenerationKnowledge Integration via Prompting推理阶段前言 你是否也对于理解论文存在困惑? 你是否也像我之前搜索论文解读,得到只是中文翻译的解读后感到失望? 小…

linux RVM安装使用

前言 RVM&#xff08;Ruby Version Manager&#xff09;是一个支持多版本Ruby的命令行程序&#xff0c;它有助于为开发和生产环境提供一致性可靠的Ruby版本。 它能够提供最新版本的Ruby&#xff0c;并管理多个版本&#xff0c;几乎在所有操作系统上都能安装和管理 Ruby。RVM 还…

RocketMQ之底层IndexFile存储协议

RocketMQ是一款高性能、高可靠、可伸缩的分布式消息中间件。在实现以上功能方面,RocketMQ采用了深度优化的存储设计方案。其中,底层IndexFile存储协议被认为是RocketMQ存储设计的关键,因此本篇文章将重点介绍RocketMQ底层IndexFile存储协议的实现机制及优缺点。 RocketMQ底…

LitCTF 2023 复现

文章目录 Hex&#xff1f;Hex&#xff01;梦想是红色的原来你也玩原神factordbP_Leake的学问Euler* Where is P?The same common divisormd5babyLCG* easy_math* Virginia* Is this only base?你是我的关键词(Keyworld)隐晦的聊天记录* baby_xor收获与体会 Hex&#xff1f;He…

VSCode中安装GPT插件详细教程

目录 安装插件 A.安装CodeGPT B.安装chatgpt 1.VSCode安装插件&#xff0c;使用本地下载vsix文件 2.获取 ChatGPT API 密钥 3.配置settings.json GPT-4主要有三大改进点 局限性 安装插件 AB功能一样&#xff0c;A安装的人最多&#xff0c;GPT具体功能可见标题链接 A.…

BLE解调

BLE解调前奏 如果不太了解IQ、FSK、GFSK的话&#xff0c;可以看上一篇&#xff0c;有一些关于这些内容的东西&#xff0c;写的应该还算好理解点吧&#xff0c;给出了自己学习时候的参考&#xff0c;具体的看他们写的。 调频与调相之间的关系 IQ调制中&#xff0c;调频是表现…

chatgpt赋能Python-anaconda降低python版本

Anaconda降低Python版本&#xff1a;为什么你需要做到这一点&#xff1f; 作为一个有10年Python编程经验的工程师&#xff0c;我经常会发现自己需要降低Pyhton的版本以便与我要使用的库兼容。为了解决这个问题&#xff0c;Anaconda是一个非常有用的工具&#xff0c;可以管理不…

基于fpga的图像处理之3x3_5x5算子模板设计

本文的思路框架&#xff1a; ①本文采用支持3x3算子模块和5x5算子模块的生成&#xff0c;用于后一级别的算法输入 ②本例程中采用的FPGA设计技巧&#xff0c;可用于借鉴&#xff0c;一是generate if参数定义&#xff1b;二是调用xilinx和altera的sync fifo和async fifo原语实现…

基于SpringBoot的招生管理系统的设计与实现

背景 本次设计任务是要设计一个招生管理系统&#xff0c;通过这个系统能够满足管理员和学生的招生公告管理功能。系统的主要功能包括首页、个人中心、学生管理、专业信息管理、专业报名管理、录取通知管理、系统管理等功能。 管理员可以根据系统给定的账号进行登录&#xff0…

做百度百科词条怎么写词条名,认证百度百科多少钱

很多人在做百度百科词条时不知道如何写百度百科词条名&#xff0c;总是因为词条不规范或者义项名不正确&#xff0c;而导致词条通过不了。认证申请百度百科到底多少钱能通过&#xff0c;实际上百度百科是免费的&#xff0c;需要费用的是请别人帮忙创建百度百科&#xff0c;下面…

SPI(Service Provider Interface)

ServiceLoad中的spi 1、简介 JDK1.6引入的特性&#xff0c;用来实现SPI&#xff08;Service Provider Interface&#xff09;&#xff0c;一种服务发现机制。 2、JDBC举例 2.1、引入mysql依赖jar <dependency><groupId>mysql</groupId><artifactId>…

[IntelliJ IDEA] 中Lombok插件的介绍和常见使用情景

文章目录 介绍使用Lombok 介绍 在编写项目时&#xff0c;尤其是在类进行类内部成员字段封装时&#xff0c;需要编写大量的get/set方法&#xff0c;不仅写的麻烦&#xff0c;如果字段名发生改变就要进行修改&#xff0c;因此非常麻烦&#xff1b;因此使用Lombok就能解决这样的问…