2012-06-13 54 views
4

我注意到一個數字,像這樣的內核源(通過谷歌搜索隨機找到):在OpenCL內核中檢查get_global_id是否必需?

__kernel void fill(__global float* array, unsigned int arrayLength, float val) 
{ 
    if(get_global_id(0) < arrayLength) 
    { 
     array[get_global_id(0)] = val; 
    } 
} 

我的問題是如果if語句實際上是必要的(假設「arrayLength」在這個例子中是與全球工作規模相同)。

在我看到的一些更「專業」的內核中,它是而不是目前。在我看來,硬件不會將內核分配給無意義的座標。

但是,我也知道處理器可以分組工作。因此,我可以想象,組中的某些處理器必須不做任何事情(例如,如果您有1個大小爲16的組,並且工作大小爲41,那麼該組將處理前16個工作項,然後接下來的16個工作項,然後接下來的9個,7個處理器沒有做任何事情 - 他們是否得到虛擬內核?)。

我檢查了spec.和「get_global_id」的唯一相關的一提的是一樣的在線文檔,其內容爲:

The global work-item ID specifies the work-item ID based on the number of global work-items specified to execute the kernel. 

。 。 。基於如何

那是什麼?如果數組的大小是工作組大小的倍數,忽略它是否安全?什麼?

謝謝
伊恩

回答

3

你有正確的答案了,我想。如果內核執行的全局大小與數組長度相同,那麼這個if語句就沒用了。

一般來說,只有在您以某種方式對數據進行分區的情況下才需要這種類型的檢查,以便您知道可以執行與數組大小相關的額外工作項。根據我的經驗,你幾乎總能避免這種情況。