.. Kenneth Lee 版权所有 2018-2020
:Authors: Kenneth Lee :Version: 1.0
加速器和其他硬件的区别
借这个文档来整理一个逻辑链。
加速器也是设备,其他硬件(比如网卡)也是设备,都是一样做DMA,都是一样和CPU一侧 的软件通讯。看起来建模型的时候是一样的,但他们需要的模型是不一样的。因为普通的 硬件都是不可取代的,只有加速器是可以取代的。加速器是另一个CPU,而不是一个完成某 个物理功能的实体。
你的软件拿一个网卡来用,这个网卡怎么连的,在物理上是有要求的,所以,网卡的模型 是这个设备必须是独占的,无论是像DPDK那样被一个应用独占,还是像一般Socket模型那 样,被驱动独占然后分解给每个应用,乃至这个网卡被分解为多个VF,然后被某个虚拟机 独占,它都是对这个设备有“连续性”需求的,你不能轻易放弃背后那个虚拟的硬件。
但加速器是不同的,我需要一个RSA加密,这次用实体A加密,下次我用实体B来加密,这没 有什么不同,我不需要独占这个设备(除非有会话,但会话结束后,我仍不需要独占这个 设备)。这是个完全的计算概念,和加速器的物理形态没有关系,我只关心它的类型。
甚至,就算这个设备现在忙了,我都可以放弃加速,直接用CPU完成我的计算。或者如果我 的应用被调度到另一个NUMA域了,我也可以让加速器跟到那个NUMA域上,不需要固定在开 始分配的那个硬件上。
这个不同带来的结果是,普通硬件要求预分配资源,要求不能互相影响,而加速器是天生 互相影响的,因为它是个调度资源,和CPU一样。对它的效率保证要求,我们通过类似操作 系统的调度器一样的手段,通过设置优先级,设置Quota,设置绑定来保证,而不是一开始 就进行绑定处理。这个调度不一定需要发生在内核,但老实说,其实发生在内核是最合适 的。我相信最后的结果肯定也是发生在内核的。
另一方面,如果我们要提高这个加速的效果,这个加速就必须直接暴露到用户态。这只有 两种办法,一种是直接作为指令集的一部分,这适合简单的向量计算,不适合比如AI这种 有大量超参需要调整的计算。另一种就是直接暴露DMA空间给进程,如果场景是多进程应用 (很多大数据应用的场景,比如Hadoop的压缩需求),这种情况,大量短生命周期会话就 成为需求。PASID的经常性更改,同时维持一个收敛比后仍很高的同时连接进程量也会成为 需求。考量这两个要素,会改变模型瓶颈的位置,所以这个要素就必须成为我们构架这个 系统的一个重要考量。
所以,我想最终我们的结果会是:有一个公共的管理中心,以Handle(Queue)为单位和进 程建立关系,进程把请求送入Handle来获得请求,调度中心决定最终进入那个硬件,完成 调度后再从queue送回给进程。我们现在只是需要把第一层打通。