GPU程式設計

以上述的迴圈(網格步幅迴圈,grid-stride loop)撰寫核心函式的優點,下列何者正確?

for (int i = blockIdx.x * blockDim.x + threadIdx.x;
     i < n;
     i += blockDim.x * gridDim.x)
    y[i] = a * x[i] + y[i];
  1. A使用迴圈會導致無法合併記憶體存取
  2. B即使啟動的執行緒數量少於元素數量,每個執行緒也能每隔總執行緒數處理多個元素,而處理所有元素
  3. C只會有一個執行緒在運作
查看答案與解析

正確答案:B. 即使啟動的執行緒數量少於元素數量,每個執行緒也能每隔總執行緒數處理多個元素,而處理所有元素

由於是每次將編號增加全部執行緒的數量(blockDim.x×gridDim.x)並重複進行,因此不論執行緒數量為何,都能毫無遺漏地處理所有元素。可以用配合GPU的SM數量的適當區塊數來啟動,也能減少建立執行緒的開銷。每一輪迴圈中,相鄰的執行緒處理相鄰的元素,因此也能維持記憶體的合併存取。

  • A. 每一輪迴圈中,相鄰的執行緒讀取相鄰的元素,因此屬於合併存取。
  • B. 正確。可將網格大小與元素數量脫鉤。
  • C. 所有執行緒都會運作。
練習這個領域 前往領域頁面

GPU程式設計的其他題目

  1. CUDA的常數記憶體(constant memory)在何種存取時運作得特別快?
  2. 關於GPU的快取,與CPU相比的一般特徵,下列何者正確?
  3. 下列何者是NVIDIA以外的GPU也能使用、用於GPU等平行計算之程式設計機制的正確例子?
  4. 想在GPU上只從陣列中取出符合條件的元素,並緊密排列寫入另一個陣列(每個執行緒輸出的數量為0或1)。下列何者是常用來決定各執行緒寫入位址的並行計算?
  5. 在撰寫GPU核心函式時,下列何者是應遵守的正確前提?

這個領域的比較