1. longfang 问的ctx的问题 adapter 方案 ctx 是在worker 内部的,每个worker有pool, ctx 等资源,完全解耦/不相关的 比如sve 是支持异步的, hw+sve 异步是完全没问题的,
代码 wd_cipher_init2_ for (i = 0; i < adapter->workers_nb; i++) { // 依次初始化各worker wd_alg_attrs_init(worker, &wd_cipher_init_attrs); switch (driver_type) { case UADK_ALG_SVE_INSTR: 分配sve的ctxs // sve, ce 其实可以合并 case UADK_ALG_HW: 分配hw的ctx
wd_cipher_common_init -> wd_init_async_request_pool(&worker->pool, // 分配worker自己的pool }
另外,adapter方案的调度是选择worker, 是以worker为调度单元 比如小包 sw,大包 hw,
我们之前的调度,是期望每次过来能选择不同的ctx, 实际中多线程需要加锁,性能跟不上,所以被废弃掉了。 直接改成了alloc_sess的时候就绑定ctx,即每个线程就指定一个ctx 我理解这个其实就是ctx_allocator
adapter 方案是把ctx 封装到worker内部了,即只管怎么选worker, 如果是硬件,还是按现在这样,绑定ctx的 目前get_worker 选择worker 是放在算法层
2. To longfang 之前想到的问题, 在群里也提过
前提是如果用户初始化的时候init(mix) 指定了选择异构调度, a, 这个代码不好改,比如已经上传了dpdk/ceph社区 b. 即使能改,init 很费时间,uadk_engine 基本是初始化的时候就init 了, 即 init 一旦选择了异构调度方案 就不会随便动了。
1) 流模式下,不能运行一半发生切换,如何避免 即调度器如何知道 现在是不是流模式,算法层的信息如何传递给调度层。
ps. adapter 方案是在 算法层做的,所以直接就能判断是否是流模式
2. 如何实现threshold, 很多场景就只是小包,无论怎么优化,就是指令集快 调度器如何知道包的大小,需要传给调度层
ps. adapter 方案是在 算法层,直接获取包的大小,这个数据结构各算法还不一样 比如req->src_len vs req->in_bytes
3. 硬件出错怎么处理,fb 异步能否实现,fb方案其实我们没验证过。 代码 cipher.c wd_do_cipher_async msg_id = wd_get_msg_from_pool(&wd_cipher_setting.pool, idx, (void **)&msg); //ctx_id a
drv: temp_msg = wd_cipher_get_msg(qp->q_info.idx, tag); // ctx_id_a
如果fb-> drv_b temp_msg = wd_cipher_get_msg(ctx_id_b, tag); // 这里我理解拿不到msg, 可能有坑
ps:adapter方案 的做法是设标记,上层retry进来选worker[1]
4. 多个加速器,如何选, hw/ce/sve 龙芳群里的回答: 指定业务运行方式,配置设备驱动 不懂 目前的做法 删掉ce的库,然后指定sve
ps:adapter方案 可以在uadk.conf 配置, 通过命令行 也可以 即生成个配置文件 /tmp/pid.conf, setenv
5. 不同平台加速器不一样,920 hw, 920b hw/ce/sve, 920c? 一套模式/算法在一个平台上调好,其他平台是否适用 龙芳群里的回答:自动适配,不区分硬件平台
不同算法可能有区别 比如rsa 就是硬件好 cipher/digest 就是小包指令集更好。
6. 未来如果有办法读取带宽,能否/怎么支持。 这个龙芳群里回答过 带宽查询功能具备以后,通过驱动的get_usage()直接读取,然后再新建一个调度器根据设备利用率实施调度
ps:adapter方案 可能做法是get_worker里面加if/else
【腾讯文档】adapter方案 https://docs.qq.com/doc/DRUxFaVJDdHJFUWdM