ISA-L库调研

天翼云开发者社区
• 阅读 215

本文分享自天翼云开发者社区《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字节 缩小后的乘法表:yul(ul为u的低四位,有16种可能),大小为16字节(128bit);yuh(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已经计算完成了,那么会填充到内存中,不再经过下一轮计算。

点赞
收藏
评论区
推荐文章
桃浪十七丶 桃浪十七丶
3年前
计算机组成原理4.1指令格式
4.1.1指令的基本概念和指令的基本格式操作码:指明CPU进行什么操作。地址码:知指明CPU对谁进行操作。PC:程序计数器,每执行一条指令会1指向下一条指令。指令的概念和基本格式:是指一台计算机执行某种操作的命令,一台计算机的所有指令的集合构成指令集,也叫做指令系统,位于计算机的硬件和OS层面。不同计算机只能执行自己系统的指令,如Intel的x86架构,手
Wesley13 Wesley13
3年前
PIC中档单片机汇编指令详解(5)
位操作指令详述BCF数据寄存器指定位清0语法形式:BCFf,b操作数:f为数据寄存器的低7位地址(0x00~0x7F)B为数据位编号(0~7)执行时间:一个指令周期执行过程:使数据寄存器f的的b位清0状态标志影响:无说明:该指令可对任何数据寄存器的任意一个位置清0,常用于标志位的设定和清除,或者把某一管脚置成低电平。指
Wesley13 Wesley13
3年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Wesley13 Wesley13
3年前
Java虚拟机(JVM)
Java虚拟机(JVM)一种用于计算机设备的规范,可用不同的方式(软件或硬件)加以实现。编译虚拟机的指令集与编译微处理器的指令集非常类似。Java虚拟机包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域。Java虚拟机(JVM)是可运行Java代码的假想计算机。只要根据JVM规格描述将解释器移植到特定的计算机上,就能保证经过编译
Stella981 Stella981
3年前
Go中的并发编程和goroutine
并发编程对于任何语言来说都不是一件简单的事情。Go在设计之初主打高并发,为使用者提供了goroutine,使用的方式虽然简单,但是用好却不是那么容易,我们一起来学习Go中的并发编程。1\.并行和并发并行(parallel):指在同一时刻,有多条指令在多个处理器上同时执行。并发(concurrency):指在
Stella981 Stella981
3年前
Noark入门之线程模型
0x00单线程多进程单线程与单进程多线程的目的都是想尽可能的利用CPU,减少CPU的空闲时间,特别是多核环境,今天咱不做深度解读,跳过...0x01线程池锁最早的一部分游戏服务器是采用线程池的方式来处理玩家的业务请求,以达最大限度的利用多核优势来提高处理业务能力。但线程池同时也带来了并发问题,为了解决同一玩家多个业务请求不被
Wesley13 Wesley13
3年前
Java虚拟机(一):JVM简介
JVM简介Java虚拟机(JVM)是由Java虚拟机规范定义的,其上运行的是字节码指令集。这种字节码指令集包含一个字节的操作码(opcode),零至多个操作数(oprand),虚拟机规范明确定义了每种字节码指令完成的功能是什么以及需要多少个操作数。Java虚拟机上运行的class文件,这个文件中包含字节码指令流以及类定义的信息,所以Java虚
Wesley13 Wesley13
3年前
Java多线程模式之流水线模式
流水线什么是流水线?在计算机中,对于一条具体的指令执行过程,通常可以分为五个部分:取指令,指令译码,取操作数,运算(ALU),写结果。前三步由指令控制器完成,后两步则由运算器完成。按照传统的方式,所有指令顺序执行,那么先是指令控制器工作,完成第一条指令的前三步,然后运算器工作,完成后两步,第一条指令执行完毕。然后第二条指令又是先
Stella981 Stella981
3年前
JVM基础命令
介绍java虚拟机的指令功能,至少能阅读java代码生成的字节码指令含义一、概述Java虚拟机采用基于栈的架构,其指令由操作码和操作数组成。操作码:一个字节长度(0~255),意味着指令集的操作码个数不能操作256条。操作数:一条指令可以有零或者多个操作数,且操作数可以是1个或者多个字节。编译后的代码没有采用操作数
Wesley13 Wesley13
3年前
Java多线程介绍
1\.线程概述1.1线程和进程进程是处于运行过程中的程序,并且具有一定的独立功能并发性:同一个时刻只能有一条指令执行,但多个进程指令被快速轮换执行并行:多条指令在多个处理器上同时执行线程是进程的执行单元1.2多
天翼云开发者社区
天翼云开发者社区
Lv1
天翼云是中国电信倾力打造的云服务品牌,致力于成为领先的云计算服务提供商。提供云主机、CDN、云电脑、大数据及AI等全线产品和场景化解决方案。
文章
675
粉丝
15
获赞
40