GCC for openEuler 结构体优化使用指导
发表于 2025/06/14
0
GCC for openEuler 结构体优化使用指导
作者:黄梓锋 | 张晓华
1 背景介绍
目前的许多应用程序都表现出极差的数据局部性,因为它们会经常访问大型的数据集,或者以可能造成缓存高速刷新的方式访问它们,这将会导致cache丢失率大幅度上升,严重影响程序性能。
针对以上情况,编译器通过变更部分struct结构体的布局方式来提升应用程序对cache的利用率。
2 优化原理
2.1 结构体重组
内存空间布局优化,将结构体成员在内存中的排布进行新的排列组合,来提高cache的命中率。
-
结构体拆分:将结构体的冷热成员单独拆分成一个结构体类型

-
结构体数组优化:将结构体的数组转化为数组的结构体

2.2 成员重排
内存空间布局优化之结构体重排优化,根据结构体中成员的占用空间大小,将成员从大到小排列,以减少边界对齐引入的padding,来减少结构体整体占用的内存大小,以提高cache的命中率。
原始结构体:
重排后结构体:
2.3 冗余成员消除
消除结构体域成员中没有引用的冗余成员,缩小结构体内存布局大小,以减少程序所分配空间大小,提升访存连续性。
2.4 指针压缩
指针压缩将结构体域成员中的结构体指针转换为该指针相对于内存池起始位置的偏移的整数,从 64 bits 压缩至可选的 8、16 和 32 bits 整形,缩小结构体占用内存大小,降低从内存中读写数据时的带宽压力,从而提升性能。
2.5 结构体数组semi-relayout
semi-relayout在一定范围内,将结构体数组中各结构体的成员打包后重排,提高数据空间局部性,从而提升性能。
将以下结构体数组在内存中的排布形式从连续的结构体按照如下图形式转换:
3. 优化选项及使用方法
3.1 优化选项
- -fipa-struct-reorg=0:不启用任何优化
- -fipa-struct-reorg=1:启用结构体拆分和结构体数组优化
- -fipa-struct-reorg=2:在 -fipa-struct-reorg=1 的基础上,新增结构体成员重排
- -fipa-struct-reorg=3:在 -fipa-struct-reorg=2 的基础上,新增结构体冗余成员消除优化
- -fipa-struct-reorg=4:在 -fipa-struct-reorg=3 的基础上,新增安全结构体指针压缩优化
- -fipa-struct-reorg=5:在 -fipa-struct-reorg=4 的基础上,放宽了结构体指针压缩优化的应用场景
- -fipa-struct-reorg=6:在 -fipa-struct-reorg=5 的基础上,新增结构体数组semi-relayout优化
3.2 使用方法
gcc -O3 -flto -flto-partition=one -fipa-struct-reorg=n
注:其中 n 的取值范围为 [0, 6],上述优化需要全局开启-O3 -flto -flto-partition=one
才能启用