GPU程式設計
在CUDA中,GPU 核心函式(GPU kernel)是加上__global__的函式。CPU端的程式接收其計算結果的方法,下列何者正確?
- A透過核心函式的回傳值(return),所有執行緒的結果會一起傳回CPU
- B核心函式將結果寫入GPU記憶體上的陣列,CPU端在核心函式結束後將該陣列複製到CPU的記憶體(或讀取統一記憶體)來接收
- CCPU端的程式將各執行緒以printf輸出的值當作變數讀取
查看答案與解析
正確答案:B. 核心函式將結果寫入GPU記憶體上的陣列,CPU端在核心函式結束後將該陣列複製到CPU的記憶體(或讀取統一記憶體)來接收
核心函式由大量執行緒同時執行,無法以單一回傳值傳回結果,CUDA規定__global__函式的回傳型別必須為void。CPU端在GPU的記憶體中配置陣列,並以引數傳入其指標,各執行緒將結果寫入自己負責的元素。由於核心函式的啟動是非同步的,要在核心函式結束後以cudaMemcpy等將陣列複製回CPU端(若為同一串流,複製會等待前一個核心函式結束)。核心函式中的printf是用於顯示的除錯手段,程式無法取回其值。
- A. __global__函式的回傳型別規定為void。
- B. 正確。結果是透過記憶體接收的。
- C. printf只是顯示,無法將輸出當作程式中的值使用。