天翼云是中国电信倾力打造的云服务品牌,致力于成为领先的云计算服务提供商。提供云主机、cdn、云电脑、大数据及ai等全线产品和场景化凯发app官方网站的解决方案。
分类: 大数据
2024-07-19 16:29:24
本文分享自天翼云开发者社区《》,作者:何****尔
1.intel simd指令集
simd(single instruction multiple data)单指令多数据流,能够复制多个操作数,并把它们打包在大型寄存器的一组指令集。以同步方式,在同一时间内执行同一条指令。
以加法指令为例,单指令单数据(sisd)的cpu对加法指令译码后,执行部件先访问内存,取得di一个操作数;之后再一次访问内存,取得第二个操作数;随后才能进行求和运算。而在simd型的cpu中,指令译码后几个执行部件同时访问内存,一次性获得所有操作数进行运算。这个特点使simd特别适合于多媒体应用等数据密集型运算。
目前主流的支持simd相关指令的寄存器有128bit(xmm 指令)、256bit(ymm 指令)这两种容量,这意味着对于64位的机器来说,分别提供了2到4倍的处理能力。
simd指令集包括从zui早的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的zui低要求是支持ssse3扩展指令集
3.isa-l简单介绍
isa-l全称intelligent storage acceleration library,是一个主要面向存储领域的在ia架构上加速算法执行速度的函数库,目的在于解决特定于存储市场的计算需求。
isa-l通过使用高效的simd指令和专用指令,zui大化的利用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指的是一次计算能处理的{banned}{banned}{banned}最佳佳佳大长度,比如名为sha256_mb_x16_avx512.asm实现的axv512版本的sha256,x16代表了一次可以取16个lane的数据,对应到数组为取16个元素),但是用户输入的数据中,单个元素中的char *长度可能有长有短,因为数据过长,在di一次hash过程中,只处理了部分数据,得到了一个中间值,那么它将加入下一轮计算,而data1已经计算完成了,那么会填充到内存中,不再经过下一轮计算。