---
title: 存储算法加速库
description: "存储算法加速库（KSAL）是华为自研的存储算法加速库，当前包括EC编解码算法、CRC16校验算法和CRC32校验算法。"
url: https://www.hikunpeng.com/document/detail/zh/kunpengsdss/twp/kunpengsdss_19_0076.html
sourcePath: /source/zh/kunpengsdss/twp/kunpengsdss_19_0076.html
indexId: 62d4049f31c79256b7b745d0757cdad809a0eccb78f9c79c36945f71fab5a2f651
---
# 存储算法加速库

#### 概述

存储算法加速库（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编码性能。

图1 向量编码多级加速

运行上下文：

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%。
