本文分享自天翼云开发者社区《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已经计算完成了,那么会填充到内存中,不再经过下一轮计算。

ISA-L库调研的更多相关文章

  1. nm U -l库的

    nm U -l库的

  2. gcc编译时头文件和库文件搜索路径

    特殊情况:用户自定义的头文件使用#include"mylib"时,gcc编译器会从当前目录查找头文件 一.头文件 gcc 在编译时寻找所需要的头文件 :    ※搜寻会从-I开始( ...

  3. linux 高级编程之库的使用

    一.静态库与动态库 静态库: .a .lib 动态库: .so .dll 差别(静态库中的代码在链接时就已经复制到可执行文件中,执行时不再依赖库,不会自动使用升级后的库,需要重新产生可执行文件. 动态 ...

  4. gcc 创建库及使用

    gcc -shared hello.c -o libhello.so gcc -o test test.c -L库所在目录 -l库名

  5. Linux下动态库生成和使用

    Linux下动态库生成和使用 一.动态库的基本概念 1.动态链接库是程序运行时加载的库,当动态链接库正确安装后,所有的程序都可以使用动态库来运行程序.动态链接库是目标文件的集合,目标文件在动态链接库中 ...

  6. Linux下静态库生成和使用

    Linux下静态库生成和使用 一.静态库概念 1.库是预编译的目标文件(object  files)的集合,它们可以被链接进程序.静态库以后缀为”.a”的特殊的存档(archive file)存储. ...

  7. C 高级编程3 静态库与动态库

    http://blog.csdn.net/Lux_Veritas/article/details/11934083http://www.cnblogs.com/catch/p/3857964.html ...

  8. Linux学习笔记7——linux中的静态库和动态库

    一.静态库的编译 静态库的编译过程如下: 1.编译成目标文件 这里有一个可选项-static,调用格式:gcc -c -static 代码文件名.c 2.归档成静态库 A.归档的工具是ar工具,使用a ...

  9. 小记UNIX编程库调用.

    更好的文章:http://www.cppblog.com/deane/articles/165216.html 静态库生成:(举例加法库) 1.编程源程序 add.h add.c 2.编译源程序,生成 ...

  10. Linux下 静态链接库 和 动态链接库

    先来说说C/C++编译过程 编译: 检查语句符号定义,将C/C++代码翻译生成中间语言. 链接: 将中间代码整合,生成可执行的二进制代码. 简单的说,库文件都是一种特殊的中间语言文件,静态库还是一种特 ...

随机推荐

  1. 5. Spring Cloud OpenFeign 声明式 WebService 客户端的超详细使用

    5. Spring Cloud OpenFeign 声明式 WebService 客户端的超详细使用 @ 目录 5. Spring Cloud OpenFeign 声明式 WebService 客户端 ...

  2. Redis中有事务吗?有何不同?

    与关系型数据库事务的区别 Redis事务是指将多条命令加入队列,一次批量执行多条命令,每条命令会按顺序执行,事务执行过程中不会被其他客户端发来的命令所打断.也就是说,Redis事务就是一次性.顺序性. ...

  3. 答题判题程序题目集 1~3 的总结性 Blog

    前言 1.1 题目集概述 答题判题程序 - 1: 字符串解析:题目内容和答题内容都是按照特定格式给出的字符串,程序需要能正确地拆分和解析这些字符串,然后进行匹配. 对象和类的使用:为了更好地管理题目和 ...

  4. 【昌哥IT课堂】MySQL8.3 EXPLAIN中的新JSON格式(译)

    MySQL提供了两个用于分析查询计划的强大工具:EXPLAIN和EXPLAIN ANALYZE.EXPLAIN显示优化器选择的执行计划,并在执行之前停止,而EXPLAIN ANALYZE实际执行查询并 ...

  5. 使用 MySQL Shell 获取 MySQL 诊断信息(译)

    收集全面的诊断信息可能会让人望而却步.知道要运行哪些查询以获取所需数据更像是一种艺术形式,而非其他什么.幸运的是,对于那些不太擅长艺术的人来说,MySQL Shell 使得获取这些信息变得更加容易.让 ...

  6. Python内建函数(H)

    hasattr(object, name) 说明:判断对象object是否包含名为name的特性(hasattr是通过调用getattr(ojbect, name)是否抛出异常来实现的). 参数obj ...

  7. 浅谈Java的Mina框架传递对象

    本篇文章主要讲解Java的Mina框架传递对象是什么,并附于代码和图片方便大家理解. AD:2013大数据全球技术峰会课程PPT下载 接触java的Mina框架已经有很多时间了,在网上也读过了很多的相 ...

  8. 网站安全锁-SSL证书

    为了安全起见,现在开发微信服务号和IOS客户端等访问服务器端都要求使用https加密传输. SSL证书是数字证书的一种,类似于驾驶证.护照和营业执照的电子副本.因为配置在服务器上,也称为SSL服务器证 ...

  9. 使用certbot申请免费SSL证书

    现在网站使用https已经成为标配,但是SSL证书最便宜的DV证书也要几百块钱一年,对于个人开发者来说很不划算.好在,我们有Let's Encrypt,它是能提供免费的SSL证书,应该也是市面上使用最 ...

  10. 攻防世界:web习题之xff_referer

    攻防世界:web习题之xff_referer 题目内容 https://adworld.xctf.org.cn/challenges/list 这道题的网页会首先会显示: 当成功修改ip地址之后会提示 ...