1.ISA-L概念
- ISA-L,全称Intelligent Storage Acceleration Library,是一个主要面向存储领域的在IA架构上加速算法执行速度的函数库。
- 目的在于解决特定于存储市场的计算需求。
- ISA-L通过使用高效的SIMD指令和专用指令,最大化的利用CPU的微架构来加速存储算法的计算过程。
- 使用同步API,调用简单,所有性能优化都是面向单核,多线程使用简单安全。ISA-L底层函数都是使用手工汇编代码编写,调优。
- ISA-L中的算法函数覆盖了数据保护,数据完整性,数据安全,数据压缩以及数据加密。
如:
纠删码erasure code的编解码运算;
用于Raid的同位检查;
保证数据传输一致性的CRC算法;
数据加解密的AES算法;
安全hash算法:MD5,SHA1到SHA512等。
2.ISA-L的整体介绍
2.1ISA-L的架构
ISA-L分为了isa-l_pub版本和isa-l_crypto版本
- isa-l_pub主要包含了在存储领域的一些算法
- isa-l_crypto主要包含的是密码学的一些算法
isa-l_pub目前版本(v2.30.0)包含了以下算法:
- EC(erasure codes) : 类型为Reed-Solomon编码的纠错码,使用了GF(2^8),并且提供了一些有限域内运算的接口。
- CRC(Cyclic Redundancy Check) : 支持iscsi32, ieee32, t10dif, ecma64, iso64, jones64多项式的循环冗余校验,不同的标准返回的crc长度也是不同的。
- Raid(Redundant Array of Independent Disks): 并不是支持磁盘阵列的标准,而是支持raid标准中经常需要用到的XOR和P + Q运算。
- Igzip(ISA-L GNU ZIP):主要支持deflate和inflate算法,同时也支持了GNU ZIP的头部信息的写入和解析。
isa-l_crypto目前版本(v2.23.0)包含了以下算法: - Multi-buffer hashes: 包含了标准SHA1、SHA256、SHA512、MD5、SM3的hash算法集。
- MH (Multi hashes) : 自研hash算法,包含了mh-sha1和mh-sha256。它的设计为了串行的hash过程 ,设计核心是将单个的buffer分组为多个块进行SIMD过程, (注意:mh1-sha256得出的结果和标准sha256得出的结果并不一致。)
- AES(Advanced Encryption Standard) : 标准的AES算法,支持GCM、CBC、XTS三种模式,并且支持128位、192位、256位密钥长度。
- Rolling hash : 标准的划窗hash
3.ISA-L的原理
ISA-L的运算快的主要原因是用了SIMD(Single Instruction Multiple Data) ,单指令流多数据流。
举个例子,存在两个数组,分别存了4个int,如果需要下标相同的元素相加的话,正常代码需要写一个循环,分别加4次再存到数组中。
而在SIMD中,只需要做一次add操作就可以完成。
也可以用伪代码来看一下两者的差别
普通指令(需要循环多次)
SIMD(Single Instruction Multiple Data) ,单指令流多数据流。(一个指令即可)
当ISA-L分发好了数据流,选定了计算所用的指令集后,就会将数据流从内存填充到具体的寄存器,再调用具体的指令集进行算法计算。一般来说,在内存中的数据流都是由多段buffer组成的。
举个例子,当用户需要计算多个数据的hash结果时,用户将数据放到内存中,组成一个char *的数组。再调用ISA-L的接口,得到一个存了所有计算好hash的数组。而在中间过程中,ISA-L每次只取出固定lane的数据进行计算(lane指的是一次计算能处理的最大长度)
用户输入数据中,单个元素的char *长度可能有长有短,如下图中的data2,因为数据过长,在第一次hash过程中,只处理了部分数据,得到了一个中间值,那么它将加入下一轮计算,而data1已经计算完成了,那么会填充到内存中,不再经过一轮计算。
从最早的MMX,到后来的SSE(包括SSE、SSE2、SSE3、SSE4)、AVX,AVX2,再到如今的AVX512指令集,都是SIMD的指令集。
而ISA-L的核心就是对于SIMD的使用,将指令集运算细节封装,再暴露出上层C的接口,以达到加速的目的。
对于不同的SIMD指令集,运算寄存器组有如下区别:
- SSE :XMM0 ~ XMM7 , 提供了8个128位寄存器
- SSE(x86-64) : XMM0 ~ XMM15,提供了16个128位寄存器
- AVX(AVX-128): XMM0 ~ XMM15,寄存器同于SSE(x86-64),不同于SSE的是,提供了更为多且方便的运算指令,比如使用vshufps代替shufps。
- AVX2(AVX-256): YMM0 ~ YMM15,提供了16个256位寄存器。提供了更多的运算指令。
- AVX512:ZMM0 ~ ZMM31,提供了32个512位寄存器。提供了更多的运算指令
那么ISA-L是如何使用SIMD来加速运算的呢
在项目include目录下有一个multibinary.asm汇编文件,该文件提供了一系列的汇编方法名为mbin_dispatch_init。而在ISA-L中的每一种算法都必须注册这个汇编方法,该方法会检查CPU flag,来获得支持的指令集,从而进行数据流的分发。
SPDK/DPDK中 ISA-L的支持情况
在DPDK中,ISA-L帮助DPDK构建了 Compression dev和 crypto dev,具体使用情况如下:
在Compression dev中, - 使用DEFLATE接口(包含在igzip中),来帮助PMD进行压缩/解压操作
- CRC32,来帮助PMD进行数据完整性校验
在crypto dev中 - AES,帮助PMD进行AES的加密/解密操作
- HASH,帮助PMD对数据进行hash操作
而在SPDK中,ISA-L作为一个git submodule被包含了进去,在很多地方也有使用ISA-L,具体如下: - SPDK中提供了vbdev_crypto和vbdev_compress,这是借助于DPDK中Compression dev和crypto dev实现的,底层同样运行了ISA-L
- ISA-L的CRC被SPDK封装成了一个util,在blobstore,tcp,iscsi,ftl,ocf等模块中都有用到。
4.如何使用ISA-L
GitHub - intel/isa-l: Intelligent Storage Acceleration Library
要进行编译以及安装库,通常只需下载源码后运行如下即可
对于isa-l_pub来说,如果需要编译target:
- make check : 编译并运行基本的运行测试,测试包含了一些内置的测试集
- make tests : 编译并运行基本的单元测试
- make perfs : 编译并运行isa-l_pub的性能测试软件,将会和openssl对比性能
- make ex : 编译内置的example,并非所有算法都有example
- make other : 编译工具集,目前isa-l_pub只提供了igzip的一个工具集。
- make doc : 编译创建api文档