【ARM 嵌入式 编译系列 4.1 -- GCC 编译属性 likely与unlikely 学习】
文章目录
- GCC likely与unlikely 介绍
- linux 内核中的 likely/unlikely
上篇文章:ARM 嵌入式 编译系列 4 – GCC 编译属性 __read_mostly 介绍
下篇文章: ARM 嵌入式 编译系列 4.2 – GCC 链接规范 extern “C“ 介绍
GCC likely与unlikely 介绍
likely 和 unlikely 是GCC编译器提供的一种代码优化特性,这两个宏用于告诉编译器某个条件判断的结果是真还是假的可能性更大。
在编写代码时,如果我们已经知道某个条件判断的结果大部分情况下都是真或者假,就可以使用likely和unlikely宏来进行标记,编译器会根据这个提示进行优化,使得代码运行更高效。
以下是这两个宏的定义:
#define likely(x) __builtin_expect((x), 1)
#define unlikely(x) __builtin_expect((x), 0)
这里的__builtin_expect 是 GCC的内建函数,用于提供编译器关于表达式结果的预期值。
以下是如何在代码中使用这两个宏的:
if (likely(x > 0)) {// 大部分情况下,x都大于0
} else { // 一般情况下,这里的代码不会执行
} if (unlikely(err != 0)) {// 一般情况下,err都等于0,所以这里的代码很少执行
}
在这两个示例中,likely和unlikely宏标记了条件判断的结果预期,这样编译器在生成机器代码时,可以将更可能执行的代码放在内存中的靠前位置,从而提高代码执行效率。
linux 内核中的 likely/unlikely
这两个宏在内核中的定义如下:
# define likely(x) __builtin_expect(!!(x), 1)
# define unlikely(x) __builtin_expect(!!(x), 0)
可见这里使用了 gcc 的内建函数 __builtin_expect()。
__builtin_expect (long exp, long c) 函数:
该函数用来引导 gcc 进行条件分支预测。在一条指令执行时,由于流水线的作用,CPU可以同时完成下一条指令的取指,这样可以提高CPU的利用率。在执行条件分支指令时,CPU也会预取下一条执行,但是如果条件分支的结果为跳转到了其他指令,那 CPU 预取的下一条指令就没用了,这样就降低了流水线的效率。
另外,跳转指令相对于顺序执行的指令会多消耗 CPU 时间,如果可以尽可能不执行跳转,也可以提高 CPU 性能。
使用 __builtin_expect (long exp, long c) 函数可以帮助 gcc 优化程序编译后的指令序列,使汇编指令尽可能的顺序执行,从而提高 CPU 预取指令的正确率和执行效率。
__builtin_expect(exp, c) 接受两个 long 型的参数,用来告诉 gcc:exp==c 的可能性比较大。
例如,__builtin_expect(exp, 1) 表示程序执行过程中,exp 取到 1 的可能性比较大。该函数的返回值为 exp 自身。
内核中 likely(x) 和 unlikely(x) 宏:
知道 __builtin_expect() 函数的作用之后,我们就知道内核中 likely(x) 和 unlikely(x) 宏的作用了,通过 likely(x) 和 unlikely(x) 宏定义,我们可以得出他们的作用:
- likely(x) 等价于 x,即
if (likely(x))等价于if (x),但是它告诉 gcc,x 取 1 的可能性比较大; - unlikely(x) 等价于 x,即
if (unlikely(x))等 价于if (x),但是它告诉 gcc,x 取 0 的可能性比较大。
上篇文章:ARM 嵌入式 编译系列 4 – GCC 编译属性 __read_mostly 介绍
下篇文章: ARM 嵌入式 编译系列 4.2 – GCC 链接规范 extern “C“ 介绍
相关文章:
【ARM 嵌入式 编译系列 4.1 -- GCC 编译属性 likely与unlikely 学习】
文章目录 GCC likely与unlikely 介绍linux 内核中的 likely/unlikely 上篇文章:ARM 嵌入式 编译系列 4 – GCC 编译属性 __read_mostly 介绍 下篇文章: ARM 嵌入式 编译系列 4.2 – GCC 链接规范 extern “C“ 介绍 GCC likely与unlikely 介绍 likely 和 unlikely …...
《算法竞赛·快冲300题》每日一题:“造电梯”
《算法竞赛快冲300题》将于2024年出版,是《算法竞赛》的辅助练习册。 所有题目放在自建的OJ New Online Judge。 用C/C、Java、Python三种语言给出代码,以中低档题为主,适合入门、进阶。 文章目录 题目描述题解C代码Java代码Python代码 “ 造…...
NSS [MoeCTF 2022]baby_file
NSS [MoeCTF 2022]baby_file 题目源码直接给了 使用data伪协议发现被ban了。 那就换一种伪协议php://filter,猜测flag在同目录下flag.php中或根目录下/flag中 php://filter/readconvert.base64-encode/resourceflag.php读取文件源码(针对php文件需要ba…...
喜报!诚恒科技与赛时达科技达成BI金蝶云星空项目合作
随着全球数字化浪潮轰轰烈烈袭来,仅仅凭借手工处理的方式难以在庞大的数据海洋中精准获取信息、把握市场需求、了解目标用户,为企业创新提供强有力的支持。深圳赛时达科技有限公司(简称赛时达科技)希望通过数字化转型实现从手工处…...
Vscode python调试和运行环境设置
Vscode python调试和运行环境设置 文章目录 Vscode python调试和运行环境设置前言一、是否为每次运行python程序都要选择环境烦恼二、是否为python程序调试不能进标准/第三方库而烦恼 前言 一、是否为每次运行python程序都要选择环境烦恼 在.vscode文件夹(没有就自己造一个)下…...
lua中执行luci.sys.call、luci.sys.exec、os.execute的区别
相同点:都是调用Linux底层脚本及程序 不同点: (1)luci.sys.call(command) 脾气捉摸不透,实际使用有些时候没有得到任何状态或数据返回,纯粹被用了一下。 (2)luci.sys.exec(command) …...
Python-OpenCV中的图像处理-模板匹配
Python-OpenCV中的图像处理-模板匹配 模板匹配单对象的模板匹配多对象的模板匹配 模板匹配 使用模板匹配可以在一幅图像中查找目标函数: cv2.matchTemplate(), cv2.minMaxLoc()模板匹配是用来在一副大图中搜寻查找模版图像位置的方法。 OpenCV 为我们提…...
模拟队列(c++题解)
实现一个队列,队列初始为空,支持四种操作: push x – 向队尾插入一个数 xx;pop – 从队头弹出一个数;empty – 判断队列是否为空;query – 查询队头元素。 现在要对队列进行 MM 个操作,其中的…...
Redis_哨兵模式
9. 哨兵模式 9.1 简介 当主库宕机,在从库中选择一个,切换为主库。 问题: 主库是否真正宕机?哪一个从库可以作为主库使用?如何实现将新的主库的信息通过给从库和客户端? 9.2 基本流程 哨兵主要任务: 监控选择主库通知 会有…...
Mysql中如果建立了索引,索引所占的空间随着数据量增长而变大,这样无论写入还是查询,性能都会有所下降,怎么处理?
索引所占空间的增长确实会对MySQL数据库的写入性能和查询性能造成影响,这主要是由于索引数据过多时会导致磁盘I/O操作变得非常频繁,从而使性能下降。为此,可以采取以下几种方式来减缓这种影响: 1. 限制索引的大小:可以…...
MySQL 约束
查看约束 select * from information_schema.table_constraints where table_name要查看的表名按约束的作用范围 列级约束: 将此约束声明在对应字段的后面 表级约束:在表中所有字段都声明完,在所有字段的后面声明的约束,可以声…...
unity实现角色体力功能【体力条+体力计算】
导读:实现功能 1、角色体力计算 2、角色疲劳动画 3、体力条制作、跟随 默认做好角色的idle/run/walk动画、切换和玩家输入,我使用的是新输入系统,动画时单变量混合树,参数Sports。 【每一部分功能根据自己需求观看哦】 1、角色体…...
【深度学习所有损失函数】在 NumPy、TensorFlow 和 PyTorch 中实现(1/2)
一、说明 在本文中,讨论了深度学习中使用的所有常见损失函数,并在NumPy,PyTorch和TensorFlow中实现了它们。 二、内容提要 我们本文所谈的代价函数如下所列: 均方误差 (MSE) 损失二进制交叉熵损失加权二进…...
七夕好物分享,哪些礼物适合送男/女朋友?这几款好物最为合适!
七夕是个值得纪念的日子,牛郎织女鹊桥相会的故事百年流传,七夕是一个表达爱意的节日,送礼物是必不可少的,情侣们可以选择一份有意义的礼物,也可以选择对方需要的东西当做礼物来赠送,总的来说,送…...
C语言学习系列-->看淡指针(2)
文章目录 前言一、数组名的理解二、使用指针访问数组三、一维数组传参本质四、二级指针五、指针数组六、指针数组模拟二维数组 前言 不把指针学的扎实,可不敢说自己C语言基础学的好 一、数组名的理解 #include <stdio.h> int main() {int arr[10] { 1,2,3,4…...
Java基础篇--Character 类
Character 类是用来操作单个字符的,它将 char 值包装在一个对象中。 实际上,在 Java 中,char 是基本数据类型,而 Character 是 char 的包装类。通过 Character 类,可以使用一系列方法来操作字符。在创建 Character 对…...
Flutter参考资料
Flutter 官网 : https://flutter.dev/ Flutter 插件下载地址 : https://pub.dev/packages Flutter 开发文档 : https://flutter.cn/docs ( 强烈推荐 ) 官方 GitHub 地址 : https://github.com/flutter Flutter 中文社区 : https://flutter.cn/ Flutter 实用教程 : https://flut…...
sed命令如何正确修改ini配置文件
需要保证key值的唯一性 function sed_key_value_file(){key$(echo "$1" | sed s/[\/&]/\\&/g)value$(echo "$2" | sed s/[\/&]/\\&/g)# 先删除原有的value,然后添加新的keyvaluesed -i -e "s#${key}.*#${key}${value}#&q…...
【新版系统架构补充】-信息系统基础知识
信息系统 信息系统的5个基本功能:输入、存储、处理、输出和控制 信息系统的分类(低级到高级):业务(数据)处理系统(TPS/DPS)、管理信息系统(MIS)、决策支持系…...
安防监控视频汇聚平台EasyCVR分发的FLV视频流在VLC中无法播放是什么原因?
众所周知,TSINGSEE青犀视频汇聚平台EasyCVR可支持多协议方式接入,包括主流标准协议国标GB28181、RTSP/Onvif、RTMP等,以及厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。在视频流的处理与分发上,视频监控…...
为什么你的Llama-3-70B推理吞吐卡在142 tokens/s?CUDA 13.3 Warp Matrix Multiply-Accumulate(WMMA)对齐失效的3个隐蔽陷阱
https://intelliparadigm.com 第一章:Llama-3-70B推理吞吐瓶颈的系统性归因 Llama-3-70B 模型在实际部署中常遭遇显著的吞吐下降(<15 tokens/s/GPU),其根源远非单一硬件限制,而是计算、内存、通信与调度四维耦合失…...
别急着重装!Pacman报‘invalid or corrupted package’?可能是你的archlinux-keyring过期了
别急着重装!Pacman报‘invalid or corrupted package’?可能是你的archlinux-keyring过期了 当你兴冲冲地敲下pacman -Syu准备更新系统时,屏幕上突然跳出鲜红的错误提示:"failed to commit transaction (invalid or corrupt…...
量子储层计算在金融风控中的实践与突破
1. 量子储层计算在金融风险评估中的创新实践量子储层计算(Quantum Reservoir Computing, QRC)作为量子机器学习的前沿分支,正在重塑金融风险建模的范式。这项技术巧妙地将量子系统的动力学特性转化为计算资源,为信用卡违约预测这类…...
Bili2Text:3分钟将B站视频转为文字稿的免费终极方案
Bili2Text:3分钟将B站视频转为文字稿的免费终极方案 【免费下载链接】bili2text Bilibili视频转文字,一步到位,输入链接即可使用 项目地址: https://gitcode.com/gh_mirrors/bi/bili2text 你是否曾为整理B站视频内容而反复观看同一片段…...
终极文档下载解决方案:告别繁琐流程,轻松获取任何可见文档
终极文档下载解决方案:告别繁琐流程,轻松获取任何可见文档 【免费下载链接】kill-doc 看到经常有小伙伴们需要下载一些免费文档,但是相关网站浏览体验不好各种广告,各种登录验证,需要很多步骤才能下载文档,…...
第二章Transformer架构解析(下)
第二章 Transformer架构解析(下) 在进入最关键的Attention之前,我们回顾一下上一个章节的内容:学到的概念核心作用Tokenization文字 → TokenEmbeddingToken → 向量Positional Encoding给向量添加位置信息LayerNorm Softmax层归一化缩放 数字变概率分…...
从“主动错误”到“总线关闭”:深入理解CAN节点错误状态机与计数器(TEC/REC)
从“主动错误”到“总线关闭”:深入理解CAN节点错误状态机与计数器(TEC/REC) 在汽车电子和工业控制领域,CAN总线作为经典的现场总线协议,其可靠性直接影响着整个系统的稳定性。当某个CAN节点开始频繁发送错误帧时&…...
Avalonia v11跨平台实战:从安装到多平台项目部署
1. Avalonia v11初体验:为什么选择这个跨平台UI框架? 第一次接触Avalonia是在去年一个需要同时支持Windows和macOS的项目中。当时尝试过几种跨平台方案,要么性能堪忧,要么开发体验差强人意。直到同事推荐了Avalonia,用…...
别再手动传源码包了!Maven的maven-source-plugin插件配置详解(附3.0.1版本避坑指南)
告别手动源码包:Maven-source-plugin高效配置全解析 每次团队协作时,你是否经历过这样的场景:同事更新了工具库的代码,你满怀期待地拉取最新依赖,却发现IDE里点不开源码,只能对着二进制文件发呆?…...
别再手动更新依赖了!手把手教你配置GitHub Dependabot,让项目自动保持最新
解放双手:用GitHub Dependabot打造智能依赖更新系统 每次启动项目时看到那一长串待更新的依赖项列表,是不是感觉头皮发麻?我曾经花费整整一周时间手动更新一个中型项目的依赖,结果因为版本冲突不得不回滚三次。这种痛苦的经历促使…...
