增加Cache命中率加快程序运行速度
2021/7/25 22:06:36
本文主要是介绍增加Cache命中率加快程序运行速度,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
场景一:改变程序运行顺序以提高Cache命中率
给定代码逻辑:当条件A成立,则执行B;否则执行C。
if (cond A) { // do sth. B } else { // do sth. C }
CPU分支预测器机制:对于if条件语句,如果CPU可以预测到接下来执行的是if还是else里的指令,就可以提前将指令加载到缓存中,这样CPU就可以直接从Cache读取到指令,以加快执行速度。
下面代码给出两个操作逻辑:数组遍历和排序。
uint32_t a[100] = {0U}; // do sth, to assign random value to a ... ... // for and if logic for (size_t i = 0U; i < 100U; i++) { if (a[i] < 50U) { a[i] = 0U; } } sort(a, a +100);
先执行排序,后执行数组遍历,程序运行速度更快。
原因是:排序之后,数组内元素从小到大按顺序排列,则前几次循环命中if的次数较多,于是分支预测会将a[i] = 0指令缓存到Cache中,后续CPU执行该指令只需要直接加载即可。
场景二:Linux通过宏定义提高优先级
编码在编码阶段,已经可以确定某个分支大概率命中,则可以通过likely和unlikely宏指定优先级。
likely与unlikely宏
在linux/compiler中有如下宏定义:
#define likely(x) __builtin_expect(!!(x), 1) // 表示x为真的可能性较大 #define unlikely(x) __builtin_expect(!!(x), 0) // 表示x为假的可能性较大
其中,__builtin_expect()函数是gcc(version>= 2.96)引入的内建函数,目的是将“分支转移”的信息提供给编译器,这样编译器可以对代码进行优化,以减少指令跳转所带来的性能下降问题。
__builtin_expect函数
函数原型如下:
long __builtin_expect(long exp, long c);
其中,exp为一个表达式,c为一个编译期常量。则上述likely宏的定义则表示,!!(x) == 1的概率较大。
编码时,可使用如下两种写法,表示(a == 1)成立的概率较大,告诉CPU提前将指令A缓存起来。
// 写法一 if (__builtin_expect((a == 1), 1) { // do sth. A } else { // do sth. B } // 写法二 if (likely(a == 1)) { // do sth. A } else { // do sth. B }
场景三:通过绑核增加缓存命中率
现代CPU都是多核心,进程运行时在不同核之间切换,导致缓存命中率下降。Linux上提供了sched_setaffinity方法进行绑核。
#define _GNU_SOURCE #include <sched.h> // function return 0 for success and -1 for failure int sched_setaffinity(pid_t pid, size_t cpusetsize, const cpu_set_t *mask); int sched_getaffinity(pid_t pid, size_t cpusetsize, cpu_set_t *mask);
参考资料:
(1)https://blog.csdn.net/qq_34827674/article/details/109147330?spm=1001.2014.3001.5502
(2)https://blog.csdn.net/fan_hai_ping/article/details/8435151
(3)https://man7.org/linux/man-pages/man2/sched_setaffinity.2.html
(4)https://www.cnblogs.com/LubinLew/p/GCC-__builtin_expect.html
这篇关于增加Cache命中率加快程序运行速度的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-07-03微信支付提示下单账户与支付账户不一致-icode9专业技术文章分享
- 2024-07-03微信支付提示订单号重复-icode9专业技术文章分享
- 2024-07-02微服务启动nacos注册上去了,但是一直没有收到请求-icode9专业技术文章分享
- 2024-07-02如何检查文件的编码格式-icode9专业技术文章分享
- 2024-07-02sublime 更改编码格式-icode9专业技术文章分享
- 2024-06-30uniAPP 实现全屏左右滚动滚动的效果-icode9专业技术文章分享
- 2024-06-30如何在本地使用授权或插件-icode9专业技术文章分享
- 2024-06-30伪静态规则配置方法汇总-icode9专业技术文章分享
- 2024-06-29易优CMS安装常见问题汇总-icode9专业技术文章分享
- 2024-06-28易优新手必读安装教程-icode9专业技术文章分享