1. ISA-L 是什么東西?
intel?-storage-acceleration-library Intel存儲加速庫盗舰,包括兩個大類:加密和非加密的蕊程。非加密的 crc局装,izip,erase-code摩幔,加密的包括sha512彤委,sha256,md5或衡,sha1等焦影。
核心技術(shù)就是使用intel sse/avx/avx2/avx256的擴展指令,并行運算多個流的方法封断。單線程比openssl要快2~8倍斯辰。
現(xiàn)在ISA-L已經(jīng)開源:
https://github.com/01org/isa-l
https://github.com/01org/isa-l_crypto
2. 接口
并行運算的接口有些像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);
}
3. 實際應(yīng)用
因為有write到writev的類似的接口,所以單buffer接口到多buffer接口的轉(zhuǎn)化是必須的坡疼。
單線程環(huán)境:只有多buffer接口彬呻,不能轉(zhuǎn)化成單buffer接口
1)緩沖多個buffer。
2)submit buffers回梧。
3)等待多個buffer結(jié)果废岂。
程序設(shè)計成多buffer + lazy load的形式祖搓。
多線程:單buffer接口設(shè)計
1)fifo 緩沖: 多個寫buffer線程 《----》fifo 《----》多個算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>>>