intel ISA-L library 程序库的使用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了intel ISA-L library 程序库的使用相关的知识,希望对你有一定的参考价值。

参考技术A intel®-storage-acceleration-library Intel存储加速库,包括两个大类:加密和非加密的。非加密的 crc,izip,erase-code,加密的包括sha512,sha256,md5,sha1等。

核心技术就是使用intel sse/avx/avx2/avx256的扩展指令,并行运算多个流的方法。单线程比openssl要快2~8倍。

现在ISA-L已经开源:

https://github.com/01org/isa-l

https://github.com/01org/isa-l_crypto

并行运算的接口有些像write/writev:

ssize_t write(int fd, const void *buf, size_t count);

ssize_t writev(int fd, const struct iovec *iov, int iovcnt);

struct iovec

void *iov_base;  /* Starting address */

size_t iov_len;  /* Number of bytes to transfer */

;

实际接口:

SHA512_HASH_CTX_MGR *mgr = NULL;

SHA512_HASH_CTX ctxpool[NUM_JOBS], *ctx = NULL;

posix_memalign((void *)&mgr, 16, sizeof(SHA512_HASH_CTX_MGR));

sha512_ctx_mgr_init(mgr);

// Init contexts before first use

for (i = 0; i < MSGS; i++)

hash_ctx_init(&ctxpool[i]);

ctxpool[i].user_data = (void *)((uint64_t) i);



for (i = 0; i < MSGS; i++)

 sha512_ctx_mgr_submit(mgr, &ctxpool[i], msgs[i], strlen((char *)msgs[i]), HASH_ENTIRE);



while (1)

     ctx = sha512_ctx_mgr_flush(mgr);

     if (ctx)

     t = (unsigned long)(ctx->user_data);



因为有write到writev的类似的接口,所以单buffer接口到多buffer接口的转化是必须的。

单线程环境:只有多buffer接口,不能转化成单buffer接口

1)缓冲多个buffer。

2)submit buffers。

3)等待多个buffer结果。

程序设计成多buffer + lazy load的形式。

多线程:单buffer接口设计

1)fifo 缓冲: 多个写buffer线程 《----》fifo 《----》多个算sha256线程。

2)promise/future 返回

   接口形式: std::future<sha256_digest> cal_sha256(voiud *buf, size_t len);

  使用std::atomic 生成sequence number,内部使用map管理 promise指针。

  map <uint64, std::unique_ptr<std::promise<sha256_digest>>>

16位汇编 多文件 intel汇编 编译器masm5.0 调用子程序库即静态库的自定义函数 WINDOWS

;以下是16位汇编 创建静态库,并调用静态库中的函数

;多文件汇编格式

;编译方法(此处用的是masm 5.0,如果是其他的编译器,有可能不能编译)

;第一种,编译方法

;1、masm main.asm  生成.obj文件

;2、masm lib.asm  生成.obj文件

;3、link main.obj lib.obj 生成.exe文件

;第二种,编译方法

;1、masm main.asm  生成.obj文件

;2、masm 16lib.asm  生成.obj文件

;3、lib 16lib.lib 16lib.obj  由.obj文件生成.lib文件,即静态库文件,可以做为函数库使用

;4、link main.obj  16lib.lib  由.obj .lib两个文件生成.exe文件

;=======================================

;(main.asm)

.model small

.stack 100h

.386

.data  

  Msg db "in my world! you know?",0  

.code

   extrn int21h_40h:far  ;引用外部函数,注意:masm5.0用的是extrn ,少一个e字符

main PROC  

  mov ax,@data  

  mov ds,ax    

  push di

  mov di,offset Msg  

  call int21h_40h     

  pop di  

  mov ax,4c00h

  int 21h main

  ENDP

END main

;==================================

;(16lib.asm)

.model small

.stack .data

.code   

  public int21h_40h ;定义外部函数

;********MS-DOS 中断 int 21h功能调用***********************

;--------int 21h 功能号 40h事例-------------

;说明:在标准输出上显示字符串

;输入参数:di = 字符串地址

;输出参数:无

int21h_40h proc far    

  xor cx,cx  

   mov dx,di ;在循环前保存参数,由于后面循环会改变di     

        ;此处也是功能 40h 的参数

L1: 

  ;计算字符串长度   

  cmp byte ptr[di],0  

  je L2  

   inc cx  

   inc di   

  jmp L1     

 L2: 

  ;显示字符串到标准输出设备上  

   mov ah,40h     

  mov bx,1     

    int 21h

    ret

int21h_40h endp

end

以上是关于intel ISA-L library 程序库的使用的主要内容,如果未能解决你的问题,请参考以下文章

无法定位序数242于动态链接库,Anaconda3Libraryinmkl_intel_thread

16位汇编 多文件 intel汇编 编译器masm5.0 调用子程序库即静态库的自定义函数 WINDOWS

Intel MKL(Math Kernel Library)

mkl调用,编译

python学习笔记-基础版

emscripten 和 CMake 库的放置位置