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