加速器和其他硬體的區別
來自專欄軟體架構設計10 人贊了文章
借這個文檔來整理一個邏輯鏈。
加速器也是設備,其他硬體(比如網卡)也是設備,都是一樣做DMA,都是一樣和CPU一側的軟體通訊。看起來建模型的時候是一樣的,但他們需要的模型是不一樣的。因為普通的硬體都是不可取代的,只有加速器是可以取代的。加速器是另一個CPU,而不是一個完成某個物理功能的實體。
你的軟體拿一個網卡來用,這個網卡怎麼連的,在物理上是有要求的,所以,網卡的模型是這個設備必須是獨佔的,無論是像DPDK那樣被一個應用獨佔,還是像一般Socket模型那樣,被驅動獨佔然後分解給每個應用,乃至這個網卡被分解為多個VF,然後被某個虛擬機獨佔,它都是對這個設備有「連續性」需求的,你不能輕易放棄背後那個虛擬的硬體。
但加速器是不同的,我需要一個RSA加密,這次用實體A加密,下次我用實體B來加密,這沒有什麼不同,我不需要獨佔這個設備(除非有會話,但會話結束後,我仍不需要獨佔這個設備)。這是個完全的計算概念,和加速器的物理形態沒有關係,我只關心它的類型。
甚至,就算這個設備現在忙了,我都可以放棄加速,直接用CPU完成我的計算。或者如果我的應用被調度到另一個NUMA域了,我也可以讓加速器跟到那個NUMA域上,不需要固定在開始分配的那個硬體上。
這個不同帶來的結果是,普通硬體要求預分配資源,要求不能互相影響,而加速器是天生互相影響的,因為它是個調度資源,和CPU一樣。對它的效率保證要求,我們通過類似操作系統的調度器一樣的手段,通過設置優先順序,設置Quota,設置綁定來保證,而不是一開始就進行綁定處理。這個調度不一定需要發生在內核,但老實說,其實發生在內核是最合適的。我相信最後的結果肯定也是發生在內核的。
另一方面,如果我們要提高這個加速的效果,這個加速就必須直接暴露到用戶態。這隻有兩種辦法,一種是直接作為指令集的一部分,這適合簡單的向量計算,不適合比如AI這種有大量超參需要調整的計算。另一種就是直接暴露DMA空間給進程,如果場景是多進程應用(很多大數據應用的場景,比如Hadoop的壓縮需求),這種情況,大量短生命周期會話就成為需求。PASID的經常性更改,同時維持一個收斂比後仍很高的同時連接進程量也會成為需求。考量這兩個要素,會改變模型瓶頸的位置,所以這個要素就必須成為我們構架這個系統的一個重要考量。
所以,我想最終我們的結果會是:有一個公共的管理中心,以Handle(Queue)為單位和進程建立關係,進程把請求送入Handle來獲得請求,調度中心決定最終進入那個硬體,完成調度後再從queue送回給進程。我們現在只是需要把第一層打通。
推薦閱讀: