存储算法加速库
概述
存储算法加速库(KSAL)是华为自研的存储算法加速库,当前包括EC编解码算法、CRC16校验算法和CRC32校验算法。
EC编解码算法通过同构映射将EC编码过程中所需的高阶有限域GF(2^w)乘法操作替换为二元矩阵乘法,将通过查表实现的复杂有限域乘法操作替代为XOR操作,同时采用编码编排算法在校验块计算过程中对中间结果进行复用,减少XOR操作数,配合鲲鹏向量化指令实现编码加速。
CRC16校验算法和CRC32校验算法采用大数求余算法原理优化以及鲲鹏亲和优化的CRC16/CRC32库替代系统标准CRC16/CRC32校验算法,提升系统性能。
技术原理
EC编解码
算法原理:
采用向量编码以低阶二元XOR操作(向量化加速)替代传统标量编码(Jerasure,ISA-L)的高阶有限域乘法(需使用LUT,10+指令操作),配合编码调度,复用中间计算结果减少操作数,大幅提升EC编码性能。
运行上下文:
Plog Client(Index侧)
调用接口:
EC编码、EC解码/重构/降级读接口
CRC16校验
假设数据信息序列多项式为M(x),本原多项式为P(x),则CRC定义为:

举例说明上面定理的含义:假设被除数是10,除数是3,则可以先用10除6,再用余数除3,得到4除3的余数。即10除6的余数为4,4除3的余数为1。
由于符合条件的并非唯一,可考虑以下的条件收缩选择范围:
- Q(x)非零项的数目对应于算法复杂度。
- Q(x)的次数对应于算法需要的寄存器数量。
- Q(x)的最高次项与第二高次项的次数差值对应于算法需要的并行度。
依应用场景的不同,可基于以上条件的权衡以选出较合适的。
CRC32校验
算法原理:
#ifdef __aarch64__
#define CRC32D(crc, value) __asm__("crc32x %w[c], %w[c], %x[v]":[c]"+r"(crc):[v]"r"(value))
#define CRC32W(crc, value) __asm__("crc32w %w[c], %w[c], %w[v]":[c]"+r"(crc):[v]"r"(value))
#define CRC32H(crc, value) __asm__("crc32h %w[c], %w[c], %w[v]":[c]"+r"(crc):[v]"r"(value))
#define CRC32B(crc, value) __asm__("crc32b %w[c], %w[c], %w[v]":[c]"+r"(crc):[v]"r"(value))
运行上下文:
消息校验,数据一致性校验。
预期效果
EC编解码
对比主流开源EC算法,编码平均吞吐性能提升100%。
CRC16校验
对比主流开源CRC16算法,4K校验性能提升100%。
CRC32校验
单个IO消耗CPU的算力减少50%以上,整体收益预计3%。在4KB、8KB、64KB、256KB和1MB块大小情况下,相比ceph_crc32c_sctp性能提升100%,相比ceph_crc32_sctp提升20%。