2012-02-16 225 views
4

我正在尋找與GPGPU計算工作時CPU如何將程序代碼移動到GPU相關的信息。互聯網有很多關於數據傳輸的手冊,但不包括關於指令/程序加載的手冊。CPU與GPU之間的指令傳輸

問題是:程序由CPU處理,CPU在每個計算單元上用適當的標誌「配置」GPU以執行給定的操作。之後,數據被傳輸和處理。第一次手術如何完成?如何向GPU發佈指令?這些指令是否可以利用總線帶寬進行分組?我可能會忽略一些基本的東西,因此歡迎任何其他信息。

回答

3

確實沒有太多關於它的信息,但是你高估了效果。

整個內核代碼只加載到GPU一次(最壞的情況是每次調用內核一次,但看起來它實際上每次執行一次,見下文),然後完全執行GPU沒有CPU的任何干預。因此,在內核調用之前,整個內核代碼被複制到某個塊中。爲了估計代碼大小,我們自制的MD軟件包(52個內核,其中一些代碼大於150行)的所有GPU代碼的大小僅爲91 KiB,因此可以安全地假設,在幾乎所有的情況下代碼傳輸時間可以忽略不計。

這裏的是什麼信息,我在官方的文檔已經找到:

CUDA Driver API,代碼在設備上加載你打電話的時候cuModuleLoad功能

CUDA驅動程序API不嘗試懶洋洋地分配模塊所需的資源 ;如果函數和數據的存儲 模塊所需(常量和全局)無法被分配, cuModuleLoad()失敗

從理論上講,你可能必須卸載模塊,然後再加載它,如果你有有幾個模塊會使用太多的常量(或靜態分配的全局)內存來同時加載,但這種模式很少見,並且在創建上下文後,通常每個應用程序啓動只會調用cuModuleLoad一次。

CUDA Runtime API沒有提供任何控制模塊加載/卸載的措施,但它看起來像所有必要的代碼在初始化期間被加載到設備上。

OpenCL Specs不像CUDA Driver API那樣具體,但代碼很可能(涉及瘋狂猜測)複製到clBuildProgram階段的設備。

+0

我感興趣的是事情是如何完成的,而不一定是在性能上。特別是,GPU如何在每個內核中處理循環/ if-else。 – amnl 2012-02-29 17:24:12

+0

@amnl分支在[CUDA C編程指南](http://developer.download.nvidia.com/compute/DevZone/docs/html/C/doc/CUDA_C_Programming_Guide.pdf)的第4.1節中介紹,本質上是對於AMD的GPU也是如此(沒有prooflink,對不起):「一個warp [32個連續的線程]一次執行一條公共指令......如果一個warp的線程通過一個依賴數據的條件分支發散,warp將連續執行每個分支禁用不在該路徑上的線程,並且當所有路徑完成時,線程收斂回相同的執行路徑。「 – aland 2012-02-29 21:09:48