長時間執行的工作負載和計算

長時間執行的工作負載(計算)是指在 10 秒內無法完成的工作負載。(這個時間是使用者在伸手去按電源按鈕之前等待的時間)。這意味著需要使用其他技術來管理那些不能使用圍欄(fence)的工作負載。

某些硬體可能會排程計算作業,並且無法搶佔它們,或無法將它們的記憶體換出。或者它們只是希望其工作負載根本不被搶佔或換出。

這意味著它與 driver-api/dma-buf.rst 中描述的內容不同。

與普通計算作業一樣,dma-fence 可能根本不被使用。在這種情況下,甚至不能用來強制搶佔。驅動程式在解綁時會被簡單地強制立即從長時間計算作業的地址空間中解除 BO 的對映,甚至不等待工作負載完成。如果硬體不支援恢復,這實際上會終止工作負載。

由於這是不希望發生的情況,因此需要採取緩解措施以防止工作負載被終止。有幾種可能的方法,各有優缺點。

您可能首先嚐試的方法是固定計算使用的所有緩衝區。這保證了作業將不間斷執行,但也允許透過儘可能多地固定記憶體,獨佔所有 GPU 記憶體,並可能獨佔大量 CPU 記憶體,從而進行非常嚴重的拒絕服務攻擊。

第二種方法是,在建立新作業(任何型別)時新增一個不驅逐的選項,這本身會稍微好一些。如果所有使用者空間都選擇此標誌,它將阻止協同使用者空間強制終止舊的計算作業以啟動新的作業。

如果作業搶佔和可恢復的頁面錯誤不可用,那麼這些是唯一可能的方法。因此,即使有了這些,您也需要一種單獨的資源控制方式。核心的標準做法是使用 cgroups。

這建立了第三個選項,即使用 cgroups 來防止驅逐。GPU 和驅動程式分配的 CPU 記憶體都將計入正確的 cgroup,並且驅逐將感知 cgroup。這允許將 GPU 分割槽到 cgroup 中,從而允許作業在彼此相鄰的情況下執行而互不干擾。

cgroup 的介面將類似於當前的 CPU 記憶體介面,如果驅逐可以感知 cgroup,則 min/low/high/max 具有相似的語義。

需要注意的是,每個記憶體區域(例如平鋪記憶體)都應該有自己的記賬方式。

鍵設定為驅動程式設定的 regionid,例如“tile0”。對於 $card 的值,我們使用 drmGetUnique()。