intel ISA-L library 程序庫的使用

1. ISA-L 是什么東西?

intel?-storage-acceleration-library Intel存儲(chǔ)加速庫,包括兩個(gè)大類:加密和非加密的。非加密的 crc,izip,erase-code,加密的包括sha512,sha256,md5,sha1等。

核心技術(shù)就是使用intel sse/avx/avx2/avx256的擴(kuò)展指令,并行運(yùn)算多個(gè)流的方法。單線程比openssl要快2~8倍。

現(xiàn)在ISA-L已經(jīng)開源:

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

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

2. 接口

并行運(yùn)算的接口有些像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 */

};

實(shí)際接口:

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);

}

3. 實(shí)際應(yīng)用

因?yàn)橛衱rite到writev的類似的接口,所以單buffer接口到多buffer接口的轉(zhuǎn)化是必須的。

單線程環(huán)境:只有多buffer接口,不能轉(zhuǎn)化成單buffer接口

1)緩沖多個(gè)buffer。

2)submit buffers。

3)等待多個(gè)buffer結(jié)果。

程序設(shè)計(jì)成多buffer + lazy load的形式。

多線程:?jiǎn)蝏uffer接口設(shè)計(jì)

1)fifo 緩沖: 多個(gè)寫buffer線程 《----》fifo 《----》多個(gè)算sha256線程。

2)promise/future 返回

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

? 使用std::atomic 生成sequence number,內(nèi)部使用map管理 promise指針。

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容