Linux-Kernel
從 Linux 核心的角度來看,使用者程序如何與 CUDA GPU 通信?
當我執行 CUDA 程序時,我很好奇數據是如何在 CPU 和 GPU 記憶體之間來回複製的。具體來說,我想知道Linux核心是如何參與這個過程的。
我有幾個可能的假設:
- CUDA 使用者庫將 GPU 視為一個文件,
read(2)
並write(2)
為每個事務呼叫和呼叫。- CUDA 使用者庫要求 Linux
mmap(2)
將相關的控制寄存器(DMA 寄存器、PIO 寄存器和其他一些 MMIO 寄存器)放入使用者空間,然後在使用者狀態下任意操作 GPU。- 還有什麼?
我通過執行簡單的 CUDA 程序來消除假設 #1,這些程序來回複製數據 1000 次(並在其間啟動一些空核心),其中
strace(1)
沒有觀察到對write(2)
和的任何呼叫read(2)
。假設 #2 似乎是可能的,因為我觀察到
time(1)
傳輸的數據量似乎隨著user
時間而不是時間而縮放sys
。所以程序似乎在使用者狀態下複製數據。但這似乎有點奇怪。一個使用者程序怎麼會被允許自己操作這些重要的 I/O 控制寄存器呢?
我將不勝感激有關此主題的一些專業想法。
應用程序在啟動時向核心請求
mmap
一組緩衝區,創建此映射是一項特權操作。正常操作只是用數據(例如紋理、頂點或命令)填充這些緩衝區,最後進行一次核心呼叫以啟動送出的命令隊列。這個啟動選通是唯一執行的寄存器訪問,其他一切都是共享記憶體。
GPU 有自己的基本 MMU,以確保命令不能引用屬於另一個上下文的數據,除非在需要的情況下(例如,將游戲中的渲染目標與疊加層中的渲染目標組合併將結果寫入 on-螢幕緩衝區)。
對於僅計算工作負載,相同的機制可以正常工作,命令隊列不是以“將數據發送到螢幕”而是以“將數據返回到主機”結束。