存储加速&加密(一)--------ISA-L

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文档
    在这里插入图片描述
    在这里插入图片描述
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值