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];
- A使用迴圈會導致無法合併記憶體存取
- B即使啟動的執行緒數量少於元素數量,每個執行緒也能每隔總執行緒數處理多個元素,而處理所有元素
- C只會有一個執行緒在運作
查看答案與解析
正確答案:B. 即使啟動的執行緒數量少於元素數量,每個執行緒也能每隔總執行緒數處理多個元素,而處理所有元素
由於是每次將編號增加全部執行緒的數量(blockDim.x×gridDim.x)並重複進行,因此不論執行緒數量為何,都能毫無遺漏地處理所有元素。可以用配合GPU的SM數量的適當區塊數來啟動,也能減少建立執行緒的開銷。每一輪迴圈中,相鄰的執行緒處理相鄰的元素,因此也能維持記憶體的合併存取。
- A. 每一輪迴圈中,相鄰的執行緒讀取相鄰的元素,因此屬於合併存取。
- B. 正確。可將網格大小與元素數量脫鉤。
- C. 所有執行緒都會運作。