2012-06-20 12 views
1

我見過的解決方案是這樣的:OpenCL的,是出界將檢查內核重要

kernel dp_square (const float *a, 
float *result) 
{ 
int id = get_global_id(0); 
result[id] = a[id] * a[id]; 
} 

kernel dp_square (const float *a, 
float *result, const unsigned int count) 
{ 
int id = get_global_id(0); 
if(id < count) 
    result[id] = a[id] * a[id]; 
} 

於ID <計數重要的檢查,如果內核的工作會發生什麼項目嘗試處理一個不可用的項目? 在第一個例子中它可能不存在的原因是程序員只是確保全局大小等於要處理的元素數量(這是正常的)嗎?

+0

超出範圍的訪問是一個錯誤,需要消除,並且在大多數情況下它會降低執行速度 – ardiyu07

回答

3

這往往是做的原因有兩個 -

  1. 爲了確保開發人員的錯誤不殺碼或閱讀記性不好

  2. 因爲有時它是最佳的運行更工作項目比有數據點。例如,如果我的設備的最佳工作組大小爲32(並不少見),並且我有61個數據的數組,我將運行64個工作項目,而最後三個項目將簡單地「發揮作用。 「

爲了不包含此檢查,您必須使用工作組大小來劃分工作項的總數。在這種情況下,這將使您的工作組大小爲1(因爲61是總理),這將非常緩慢!

+0

謝謝!這爲我澄清了它 –