1. ISA-L 是什么东西?
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
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. 实际应用
因为有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>>>