写点什么

ISA-L 库调研

  • 2024-07-19
    北京
  • 本文字数:2146 字

    阅读完需:约 7 分钟

本文分享自天翼云开发者社区《ISA-L库调研》,作者:何****尔


1.Intel SIMD 指令集

SIMD(single instruction multiple data)单指令多数据流,能够复制多个操作数,并把它们打包在大型寄存器的一组指令集。以同步方式,在同一时间内执行同一条指令。

以加法指令为例,单指令单数据(SISD)的 CPU 对加法指令译码后,执行部件先访问内存,取得第一个操作数;之后再一次访问内存,取得第二个操作数;随后才能进行求和运算。而在 SIMD 型的 CPU 中,指令译码后几个执行部件同时访问内存,一次性获得所有操作数进行运算。这个特点使 SIMD 特别适合于多媒体应用等数据密集型运算。

目前主流的支持 SIMD 相关指令的寄存器有 128bit(XMM 指令)、256bit(YMM 指令)这两种容量,这意味着对于 64 位的机器来说,分别提供了 2 到 4 倍的处理能力。

SIMD 指令集包括从最早的 MMX,到后来的 SSE(包括 SSE、SSE2、SSE3、SSE4)、AVX,AVX2,再到如今的 AVX512 指令集。

对于不同的 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 位寄存器。提供了更多的运算指令。

数据级并行(Data Level Parallelism):

主要运用了 SIMD 单指令多数据流技术。通过一个指令,对一组多个相同类型的数据(SIMD 也称"数据向量”)进行同一的操作。SIMD 指令集可以提供更快的图像,声音,视频数据等运行速度,常见的 SIMD 指令集有 MMX,SSE 和 AVX。


2.EC 中的 SIMD

ec 使用 GF(2^8):所有数都是一字节的

ec 中主要操作是矩阵相乘,每次乘法可以通过查指数和对数表实现,也可以通过直接查乘法表实现,乘法表为避免过大,把乘数拆成高四位和低四位,再通过移位相加得到结果。

乘法表:y * u(y 固定,u 有 256 种可能),大小为 256 字节

缩小后的乘法表:y*ul(ul 为 u 的低四位,有 16 种可能),大小为 16 字节(128bit);y*uh(uh 为 u 的高四位,有 16 种可能),大小为 16 字节。刚好可以放在 XMM 寄存器里。

使用 SIMD 实现查表操作并行处理

两个寄存器,一个寄存器放乘法表,一个寄存器放要查的多个乘数

1.参数 1:将生成的乘法表放入 XMM 寄存器

2.参数 2:将 16 个要查询的值放入 XMM 寄存器(一次查询从从 1 个字节到 16 甚至 32 个字节)

3.执行函数进行查询

同理 SIMD 还可以并行处理异或操作

同理 ec 选择 GF(2^16),GF(2^32)等多字节数都可实现

在使用 SIMD 加速有限域运算时,对 CPU 的最低要求是支持 SSSE3 扩展指令集


3.isa-l 简单介绍

ISA-L 全称 Intelligent Storage Acceleration Library,是一个主要面向存储领域的在 IA 架构上加速算法执行速度的函数库,目的在于解决特定于存储市场的计算需求。

ISA-L 通过使用高效的 SIMD 指令和专用指令,最大化的利用 CPU 的微架构来加速存储算法的计算过程。使用同步 API,调用简单,所有性能优化都是面向单核,多线程使用简单安全。

ISA-L 底层函数都是使用手工汇编代码编写,调优。通过源码包中的 C 示例函数,可以非常容易的理解并整合到客户的软件系统中。

ISA-L 可以应用到多种操作系统中,它通过了在 Linux,BSD 以及 Windows server 上的测试,全面支持 Intel 64 位硬件平台。

ISA-L 中的算法函数覆盖了数据保护,数据完整性,数据安全,数据压缩以及数据加密。

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 的头部信 息的写入和解析。


4.isa-l 使用

/include 目录下有一个 multibinary.asm 汇编文件,该文件提供了一系列的汇编方法名为 mbin_dispatch_init,而在 ISA-L 中的每一种算法都必须注册这个汇编方法,该方法会检查你的 CPU flag,来获得支持的指令集,从而进行数据流的分发。

举个例子,当你调用 ISA-L 中 sha256 的方法,ISA-L 会检测到你的 CPU 只支持 AVX2,那么会把数据流分发到 AVX2 的汇编算法进行下一步操作。

而当 ISA-L 分发好了数据流,选定了计算所用的指令集后,就会将数据流从内存填充到具体的寄存器,再调用具体的指令集进行算法计算。

举个例子,当用户需要计算多个数据的 hash 结果时,用户将数据放到内存中,组成一个 char *的数组。再调用 ISA-L 的接口,得到一个存了所有计算好 hash 的数组。

而在中间过程中,无论用户放到内存中的数组有多长,ISA-L 每次只取出固定 lane 的数据进行计算(lane 指的是一次计算能处理的最大长度,比如名为 sha256_mb_x16_avx512.asm 实现的 axv512 版本的 sha256,x16 代表了一次可以取 16 个 lane 的数据,对应到数组为取 16 个元素),但是用户输入的数据中,单个元素中的 char *长度可能有长有短,因为数据过长,在第一次 hash 过程中,只处理了部分数据,得到了一个中间值,那么它将加入下一轮计算,而 data1 已经计算完成了,那么会填充到内存中,不再经过下一轮计算。

用户头像

还未添加个人签名 2022-02-22 加入

天翼云是中国电信倾力打造的云服务品牌,致力于成为领先的云计算服务提供商。提供云主机、CDN、云电脑、大数据及AI等全线产品和场景化解决方案。

评论

发布
暂无评论
ISA-L库调研_大数据_天翼云开发者社区_InfoQ写作社区