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];
}
- A當執行緒總數多於元素數時,避免多餘的執行緒讀寫陣列範圍之外
- B避免加總的結果超過n
- C讓GPU的速度加倍
查看答案與解析
正確答案:A. 當執行緒總數多於元素數時,避免多餘的執行緒讀寫陣列範圍之外
執行緒是以區塊為單位啟動的,因此若元素數不是區塊大小的倍數,執行緒總數就會超過元素數。若不檢查編號就寫入,可能會破壞所配置陣列之外的記憶體,或因非法存取而發生錯誤。「i < n」的檢查,是撰寫GPU核心函式時幾乎固定的寫法。
- A. 正確。用來處理因區塊數無條件進位而產生的多餘部分。
- B. 檢查的不是值的大小,而是編號的範圍。
- C. 不是為了速度,而是為了正確性。