GPU程式設計

在CUDA中,GPU 核心函式(GPU kernel)是加上__global__的函式。CPU端的程式接收其計算結果的方法,下列何者正確?

  1. A透過核心函式的回傳值(return),所有執行緒的結果會一起傳回CPU
  2. B核心函式將結果寫入GPU記憶體上的陣列,CPU端在核心函式結束後將該陣列複製到CPU的記憶體(或讀取統一記憶體)來接收
  3. CCPU端的程式將各執行緒以printf輸出的值當作變數讀取
查看答案與解析

正確答案:B. 核心函式將結果寫入GPU記憶體上的陣列,CPU端在核心函式結束後將該陣列複製到CPU的記憶體(或讀取統一記憶體)來接收

核心函式由大量執行緒同時執行,無法以單一回傳值傳回結果,CUDA規定__global__函式的回傳型別必須為void。CPU端在GPU的記憶體中配置陣列,並以引數傳入其指標,各執行緒將結果寫入自己負責的元素。由於核心函式的啟動是非同步的,要在核心函式結束後以cudaMemcpy等將陣列複製回CPU端(若為同一串流,複製會等待前一個核心函式結束)。核心函式中的printf是用於顯示的除錯手段,程式無法取回其值。

  • A. __global__函式的回傳型別規定為void。
  • B. 正確。結果是透過記憶體接收的。
  • C. printf只是顯示,無法將輸出當作程式中的值使用。
練習這個領域 前往領域頁面

相關計算工具

GPU程式設計的其他題目

  1. 在每個執行緒區塊(Thread block)的執行緒數上限為1024的GPU上,將blockDim.x設為2048來啟動CUDA的核心函式。一般會發生什麼情況?
  2. 假設GPU的SM中有一個發出指令的機制,每個週期可從一個線程束發出指令。各線程束重複「發出20個週期份的指令後,等待400個週期直到記憶體讀取的結果送達」。若切換線程束不需時間,要以延遲隱藏(Latency hiding)消除記憶體等待造成的閒置時間,最少需要幾個線程束?
  3. 關於CPU與GPU設計理念的差異,下列何者正確?
  4. 下列何者最適合作為GPU能快速處理之工作的特徵?
  5. 下列何者是在GPU上執行時容易效率不佳的處理?

這個領域的比較