当前位置: 首页 > news >正文

合理布局结构体,精打细算 cacheline

突然想起多年前做的一个优化,相关的还涉及一个诡异的事,先看这两篇文字:保持内存紧凑性,快速路径慎用 kmalloc。

最近又遇到这类事,还是一样的原则,“一起经常被访问的字段要紧挨着放,尽量使它们处于同一个 cacheline”。看一个紧凑型的结构体:

#define CACHELINE_SIZE 128
#define ARRAY_SIZE 100000typedef struct {int a;int b;int c;int d;//char pad[256 - 16];char pad2[519 - 16];
} __attribute__((packed)) CompactStruct;

再看一个非紧凑型的:

#define CACHELINE_SIZE 128
#define ARRAY_SIZE 100000typedef struct {int a;char padding1[CACHELINE_SIZE - sizeof(int) + 1];int b;char padding2[CACHELINE_SIZE - sizeof(int) + 1];int c;char padding3[CACHELINE_SIZE - sizeof(int) + 1];int d;char padding4[CACHELINE_SIZE - sizeof(int) + 1];char pad2[3];
} __attribute__((packed)) ScatteredStruct;

执行下面的逻辑,哪个更快呢:

for (int i = 0; i < ARRAY_SIZE; i++) {sum += arr[i].a + arr[i].b + arr[i].c + arr[i].d;
}

结构体字段的布局也是门手艺。像 TCP 处理,比如在接收路径,会频繁访问 snd_cwnd,snd_una,snd_wnd,snd_nxt,…,那么就有必要让上述这些字段挨得近一些,而不是随意散布在结构体的任意位置。总之,这个优化是立竿见影的。

但这种优化是极度拧巴的体系结构相关,我就从公司的 x86_64 换到家里的 Apple M2,结构体宏定义就改了一大堆,站在程序的视角,它本不应该了解这么多东西,cache 是默默起作用的,但反过来,既然你想让 cache 起更大作用,那就必须理解它的细节,方能调教好它。

但要记住,这类优化措施一定是最后才要考虑的,远在算法优化和系统级优化之后,首先还是要考虑算法能不能更优,压缩大 O 数量级,其次要考虑系统能不能更优,比如锁,并行,再然后就是操作系统级别的,比如进程,线程,最后才是体系结构相关的优化,这也是一个自上而下的顺序,从你要解决问题的算法开始,到硬件结束。

浙江温州皮鞋湿,下雨进水不会胖。

相关文章:

  • CONVOLUTION MEETS LORA(卷积遇到LORA)
  • 【大模型微调与应用开发实战指南】从理论到工业级部署
  • 【java】lambda表达式总结
  • SALOME源码分析:Geomtry模块
  • Vue响应式数据详解
  • Embedding入门概述
  • 制作一款打飞机游戏27:精灵编辑器UI
  • python文本合并脚本
  • G1(Garbage-First)垃圾回收器与JVM内存
  • 闭包与装饰器(python)
  • Go语言企业级项目使用dlv调试
  • 30天通过软考高项-第五天
  • Python+jieba文本分析示例:实现统计《红楼梦》中的人物并生成词云图
  • Golang 类型方法
  • 可视化图解算法:对称的二叉树(判断二叉树是否为对称的)
  • 企业如何构建一个全面的Web安全防护体系
  • AVL树的介绍与学习
  • 【Pandas】pandas DataFrame rfloordiv
  • Python对比两张CAD图并标记差异的解决方案
  • 软件功能设计视角下的能源管理系统功能清单构建与实践
  • 经济日报:多平台告别“仅退款”,规则调整有何影响
  • 中国航天员乘组完成在轨交接,神十九乘组将于29日返回地球
  • 70后供销合作总社理事会原副主任侯顺利任中国融通外部董事
  • 摩根士丹利基金雷志勇:AI带来的产业演进仍在继续,看好三大景气领域
  • 新华时评:坚定不移办好自己的事,着力抓好“四稳”
  • 铜钴巨头洛阳钼业一季度净利润同比大增九成,最新宣布超30亿元收购黄金资产