Linux-Kernel

從 Linux 核心的角度來看,使用者程序如何與 CUDA GPU 通信?

  • March 15, 2021

當我執行 CUDA 程序時,我很好奇數據是如何在 CPU 和 GPU 記憶體之間來回複製的。具體來說,我想知道Linux核心是如何參與這個過程的。

我有幾個可能的假設:

  1. CUDA 使用者庫將 GPU 視為一個文件,read(2)write(2)為每個事務呼叫和呼叫。
  2. CUDA 使用者庫要求 Linuxmmap(2)將相關的控制寄存器(DMA 寄存器、PIO 寄存器和其他一些 MMIO 寄存器)放入使用者空間,然後在使用者狀態下任意操作 GPU。
  3. 還有什麼?

我通過執行簡單的 CUDA 程序來消除假設 #1,這些程序來回複製數據 1000 次(並在其間啟動一些空核心),其中strace(1)沒有觀察到對write(2)和的任何呼叫read(2)

假設 #2 似乎是可能的,因為我觀察到time(1)傳輸的數據量似乎隨著user時間而不是時間而縮放sys。所以程序似乎在使用者狀態下複製數據。

但這似乎有點奇怪。一個使用者程序怎麼會被允許自己操作這些重要的 I/O 控制寄存器呢?

我將不勝感激有關此主題的一些專業想法。

應用程序在啟動時向核心請求mmap一組緩衝區,創建此映射是一項特權操作。

正常操作只是用數據(例如紋理、頂點或命令)填充這些緩衝區,最後進行一次核心呼叫以啟動送出的命令隊列。這個啟動選通是唯一執行的寄存器訪問,其他一切都是共享記憶體。

GPU 有自己的基本 MMU,以確保命令不能引用屬於另一個上下文的數據,除非在需要的情況下(例如,將游戲中的渲染目標與疊加層中的渲染目標組合併將結果寫入 on-螢幕緩衝區)。

對於僅計算工作負載,相同的機制可以正常工作,命令隊列不是以“將數據發送到螢幕”而是以“將數據返回到主機”結束。

引用自:https://unix.stackexchange.com/questions/639311