如何利用x86 SIMD优化批量变长整数编解码(附可运行基准)
自定义可变长度整数编码方案及解码优化需求
现有编码规则
将16个int64_t组成的小块编码为以下结构的块:
- 8字节标志位段:打包16个半字节(4位)的flag,每字节存储2个flag
- 可变长度payload段:每个输入
int64_t对应1个或多个字节,具体规则:- 单个flag占4位(半字节)
- flag高位1位存储
sign(value)(符号标识) - flag低3位存储
abs(value)所需的字节数 - payload中存储
abs(value)的二进制数据,字节数由flag低3位指定
经实际数据测试,该方案的压缩率与编解码速度均优于LEB128(varint)和LZ4。
特殊数据特征
- 绝大多数
abs(value)的存储长度≤2字节 - 99%的场景下:
- 连续4个
abs(value)的总存储字节数≤7 - 连续16个
abs(value)的总存储字节数≤31
- 连续4个
优化需求
核心聚焦解码速度优化,允许调整编解码格式,希望了解是否可通过SIMD指令集实现加速。核心优化目标函数为encode和decode_original。
附:现有实现及测试信息
原始实现代码
// 此处填入decode_original及encode的原始实现代码
优化版本实现(aqrit、Soonts版本)
// 此处填入aqrit、Soonts的优化实现代码
编译命令
# 示例编译命令,可根据实际环境调整 gcc -O3 -march=native -o codec_test codec.c
多CPU基准测试结果
| CPU型号 | 原始解码速度 | aqrit优化版速度 | Soonts优化版速度 |
|---|---|---|---|
| [CPU型号1] | X MB/s | Y MB/s | Z MB/s |
| [CPU型号2] | A MB/s | B MB/s | C MB/s |
| [CPU型号3] | D MB/s | E MB/s | F MB/s |
内容的提问来源于stack exchange,提问作者Huy Le
相关产品推荐
相关产品推荐

