UTL源自FastLanes项目,它致力于让delta解码变得高度数据并行。然而论文对布局的描述令人困惑,所以我打算在这里尝试用自己的方式进行解释。
本文假设读者已经了解delta编码的基本概念,以及SIMD计算的基础知识。
![]()
基本的delta编码/解码本质上是一个串行问题,因为要计算每个数值,都必须先算出它之前的所有数值。FastLanes所关注的部分,就是为了给这个问题增加并行性,从而借助SIMD让delta编码,尤其是解码,变得非常快。
SIMD指令集拥有专用的宽向量寄存器。在现代系统上,这些寄存器可以从128位(SSE、Arm的Neon)一直到512位(AVX-512),并且可以被切分为不同大小的通道。指令会在所有通道上并行执行相同的操作。例如一个64位的向量寄存器(按现代标准非常小),可以分解为8位、16位和32位通道。
FastLanes围绕一个虚拟的1024位SIMD寄存器来设计算法,其宽度超过了任何主流ISA的实际处理能力。这样做的原因是:用较窄的寄存器去实现为宽寄存器设计的算法非常容易——只需把每个宽操作拆分成几个窄操作即可。
反过来说,把针对窄SIMD宽度设计的算法移植到更宽的寄存器上会异常困难,因为最终很可能落入同一寄存器的不同通道之间存在数据依赖的困境。这种依赖会彻底拖垮性能,所以必须避免。
因此,我们讨论的FastLanes算法都基于1024位寄存器,通道结构可以是16x64位、32x32位、64x16位或128x8位。在1024位寄存器上高效的算法,在实际机器的128/256/512位寄存器上同样有效。
让我们从一个包含1024个64位整数的数组开始。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.