2013-11-20 58 views
0

我有兩個問題:內核underworking問題和執行成本

  1. 是更好地使內核過度勞累或underwork?比方說,我想用僅有4個GPU核心來計算差異圖像。我應該考慮我的圖像的任何像素是由1個線程獨立計算還是應該讓1個線程計算我的圖像的整行?我不知道哪種解決方案最適合使用。我已經矢量化了第一個選項(它被推送了),但我只獲得了一些ms,但這不是很有意義。
  2. 我的第二個問題是關於內核的執行成本。我知道如何測量任何OpenCL命令隊列任務(複製,寫入,讀取,內核...),但我認爲主機需要花費時間將內核加載到GPU內核。有什麼方法可以評估它嗎?

巴蒂斯特

回答

1

(1)

通常你會處理在內核中的單個項目。如果處理多個項目,則需要按正確的順序執行它們以確保內存訪問的一致性,否則將比執行單個項目慢(解決方案是爲每個工作項目而不是一行處理一列)。

爲什麼在多個項目上工作會更慢的另一個原因是您可能會使計算單位閒置。例如,如果您在具有700個計算單位的1000x1000圖像上處理掃描線,則該工作將被分成700個工作項目,然後只有300個工作項目(剩下400個空閒)。

如果您要使用共享本地內存,您希望在單個內核中執行大量工作的情況。例如,如果將查找表(LUT)加載到SLM中,則應將其用於整個掃描線或圖像。

(2)

我敢肯定,這是一個時間非零量,但它是可以忽略不計。內核代碼非常小。驅動程序將其移動到GPU,並處理將參數數據推送到GPU上。兩者都非常快,而且在其他內核運行時可能會發生,所以是「免費」的。