GPU程式設計

上述CUDA核心函式中加入「if (i < n)」的理由,下列何者正確?

__global__ void add(float *c, const float *a,
                    const float *b, int n) {
    int i = blockIdx.x * blockDim.x + threadIdx.x;
    if (i < n)
        c[i] = a[i] + b[i];
}
  1. A當執行緒總數多於元素數時,避免多餘的執行緒讀寫陣列範圍之外
  2. B避免加總的結果超過n
  3. C讓GPU的速度加倍
查看答案與解析

正確答案:A. 當執行緒總數多於元素數時,避免多餘的執行緒讀寫陣列範圍之外

執行緒是以區塊為單位啟動的,因此若元素數不是區塊大小的倍數,執行緒總數就會超過元素數。若不檢查編號就寫入,可能會破壞所配置陣列之外的記憶體,或因非法存取而發生錯誤。「i < n」的檢查,是撰寫GPU核心函式時幾乎固定的寫法。

  • A. 正確。用來處理因區塊數無條件進位而產生的多餘部分。
  • B. 檢查的不是值的大小,而是編號的範圍。
  • C. 不是為了速度,而是為了正確性。
練習這個領域 前往領域頁面

GPU程式設計的其他題目

  1. 在NVIDIA的GPU中,將32個執行緒組成一束並同時執行相同指令的單位稱為什麼?
  2. 關於GPU的SIMT(單一指令、多執行緒)方式與CPU的SIMD指令之差異,下列何者正確?
  3. 在一個線程束中,因條件分支使一半的執行緒走if側、另一半走else側(線程束發散,warp divergence)。一般會如何執行?
  4. 上述的(1)與(2)都是讓一半的執行緒執行A、其餘執行B。就線程束的效率而言,下列何者說明正確(設1個線程束為32個執行緒)?
  5. 關於GPU的記憶體合併存取(coalescing),下列說明何者正確?

這個領域的比較