GPU程式設計

在CUDA中,想在核心函式途中,等待其他所有區塊的計算結束後再進入下一階段。下列何者是一般的方法?

  1. A呼叫__syncthreads()
  2. B在該處將核心函式分成兩個,待第一個核心函式結束後再啟動第二個
  3. C以迴圈持續等待其他區塊寫入的旗標
查看答案與解析

正確答案:B. 在該處將核心函式分成兩個,待第一個核心函式結束後再啟動第二個

區塊的規定是可獨立地以任何順序執行,因此並不保證所有區塊都同時載入GPU。若等待的對象區塊尚未開始,等待旗標的迴圈就永遠不會結束。因此,一般是利用在同一串流中啟動的核心函式要等前一個核心函式結束才會開始的性質,藉由拆分核心函式來取得整體的同步。

  • A. __syncthreads()只能在同一個區塊內同步。
  • B. 正確。核心函式的交界處就成為整體的同步點。
  • C. 由於不保證所有區塊都同時載入,可能會停住。
練習這個領域 前往領域頁面

GPU程式設計的其他題目

  1. 以GPU製作像素值的直方圖時,若所有執行緒都用atomicAdd直接對全域記憶體中的256個分格(bin)進行加總,有時會很慢。下列何者是正確的改善方法?
  2. 以GPU求取大量數值的總和時,使用樹狀歸約(reduction,重複將相鄰的值相加而使數量減半)的理由,下列何者正確?
  3. 以樹狀歸約加總1024個值時,所需的階段數為多少?
  4. 在使用單一GPU的程式中,關於CPU端記憶體與GPU端記憶體,下列何者通常是正確的?
  5. 對於只對陣列元素做一次加法這類輕量的處理,若將資料傳送到GPU,有時會比用CPU計算還慢。下列何者是主要原因?

這個領域的比較