优化聚集/分散模式以提升性能
1. 聚集/分散操作概述
许多现代微架构依赖单指令多数据(SIMD)执行来以节能的方式提供高计算能力。这类微架构通常针对内存中连续布局的数据进行了优化,但通过聚集(gather)和分散(scatter)操作,即使数据在内存中不连续,也能支持 SIMD 执行。
- 聚集操作 :从内存中读取单独寻址的元素,并将它们打包到单个 SIMD 寄存器中。
- 分散操作 :将 SIMD 寄存器中的元素解包,并写入到单独的内存位置。
聚集和分散操作的执行方式因平台而异,有时在软件中进行,有时使用专用硬件指令。这些操作的内存地址在运行时才需要确定,可以表示任何访问模式,使程序员和编译器能够对不规则的循环进行向量化。
然而,聚集和分散操作比连续的 SIMD 加载和存储操作需要硬件做更多的工作,通常具有更高的指令开销、更低的可预测性,并且可能访问更多的缓存行/页面。因此,程序员应尽量避免间接寻址和非连续访问,以减少它们的使用。但在某些算法中,间接寻址可能是固有的,例如数据元素按输入依赖的顺序访问,或为了降低计算复杂度而对部分数据元素进行计算。
2. 数据布局对聚集/分散操作的影响
非连续访问通常是由程序员选择的数据布局引入的,常见的两种数据布局是结构数组(Array-of-Structures,AoS)和数组结构(Structure-of-Arrays,SoA)。
2.1 AoS 和 SoA 的布局特点
- AoS :允许程序员根据领域有意义的
订阅专栏 解锁全文
3445

被折叠的 条评论
为什么被折叠?



