GPU程式設計
以GPU製作像素值的直方圖時,若所有執行緒都用atomicAdd直接對全域記憶體中的256個分格(bin)進行加總,有時會很慢。下列何者是正確的改善方法?
- A不再使用atomicAdd,以一般的加法寫入全域記憶體
- B將分格的數量合併為1個
- C每個區塊先在共享記憶體中製作局部的直方圖,最後再一併加總到全域記憶體的分格
查看答案與解析
正確答案:C. 每個區塊先在共享記憶體中製作局部的直方圖,最後再一併加總到全域記憶體的分格
當大量執行緒同時對同一個分格執行atomicAdd,更新會被逐一依序處理,而且全域記憶體很慢,因此等待時間會變長。若讓各區塊在共享記憶體中擁有自己專用的直方圖,在其中計數,最後只對全域記憶體加總一次,則在慢速記憶體上的競爭次數會減少為區塊數×分格數。共享記憶體上的原子運算可以快得多。
- A. 會因資料競爭而遺失計數。
- B. 直方圖就失去意義了。
- C. 正確。在慢速全域記憶體上的競爭會大幅減少。