GPU程式設計

以GPU製作像素值的直方圖時,若所有執行緒都用atomicAdd直接對全域記憶體中的256個分格(bin)進行加總,有時會很慢。下列何者是正確的改善方法?

  1. A不再使用atomicAdd,以一般的加法寫入全域記憶體
  2. B將分格的數量合併為1個
  3. C每個區塊先在共享記憶體中製作局部的直方圖,最後再一併加總到全域記憶體的分格
查看答案與解析

正確答案:C. 每個區塊先在共享記憶體中製作局部的直方圖,最後再一併加總到全域記憶體的分格

當大量執行緒同時對同一個分格執行atomicAdd,更新會被逐一依序處理,而且全域記憶體很慢,因此等待時間會變長。若讓各區塊在共享記憶體中擁有自己專用的直方圖,在其中計數,最後只對全域記憶體加總一次,則在慢速記憶體上的競爭次數會減少為區塊數×分格數。共享記憶體上的原子運算可以快得多。

  • A. 會因資料競爭而遺失計數。
  • B. 直方圖就失去意義了。
  • C. 正確。在慢速全域記憶體上的競爭會大幅減少。
練習這個領域 前往領域頁面

GPU程式設計的其他題目

  1. 以GPU求取大量數值的總和時,使用樹狀歸約(reduction,重複將相鄰的值相加而使數量減半)的理由,下列何者正確?
  2. 以樹狀歸約加總1024個值時,所需的階段數為多少?
  3. 在使用單一GPU的程式中,關於CPU端記憶體與GPU端記憶體,下列何者通常是正確的?
  4. 對於只對陣列元素做一次加法這類輕量的處理,若將資料傳送到GPU,有時會比用CPU計算還慢。下列何者是主要原因?
  5. 將CPU記憶體固定(鎖頁,page-lock)後再傳輸到GPU會比較快,其理由下列何者正確?

這個領域的比較