2017-02-12 23 views
2

我正在編寫OpenCL程序,但是我的全局工作大小不是本地工作大小的倍數。在OpenCL中,全局工作大小必須能夠被當地工作大小整除,所以我讀到的一個解決方案是添加一些額外的工作項目,這些工作項目無法收集全局工作大小的大小並使其可以被選定的本地工作大小整除。如何添加額外的工作項目以使全局工作大小成爲本地工作大小的倍數

舉例來說,假設地方工作大小爲4和全球工作尺寸爲62(你有一個內核需要對它們進行操作62元)

這裏的想法是添加2個工作項只是閒置,爲了使全球工作規模爲64.因此,64可以被4整除,一切都很好。

關於如何實現這樣的閒置工作的任何想法?如果我簡單地將全局工作大小增加到64,我有兩次額外的內核執行,這會改變程序正在執行的計算結果,最終會產生錯誤的結果。

+0

你將不得不增加內核內部邊界檢查,這確保只有那些線程執行計算其全球指數落在有效數據範圍內。 – sgarizvi

回答

2

這是一種標準方法,將全球工作規模調整爲本地工作規模的倍數。在這種情況下,我們必須在內核中添加綁定檢查,以確保只有那些工作項執行落在有效數據範圍內的計算。可以通過將實際數據大小指定爲內核參數並將其與全局工作項索引進行比較來完成。示例內核將如下所示:

__kernel void example_kernel(__global int* input, __global int* output, int dataSize) 
{ 
    int index = get_global_id(0); 

    if (index < dataSize) 
    { 
     /* 
     rest of the kernel... 
     */ 
    } 
} 
+0

非常感謝,我沒有考慮內核中的綁定檢查 – alairbyday

1

OpenCL 2.0以後,不再需要擁有全局工作大小倍數的本地工作大小。

除非有真正的性能優勢,否則最好留下本地工作規模NULL

可以捨去GWS和邊緣工作iters

gws = (old_gws/lws) * lws; 
leftover = old_gws - gws; 

在內核中做額外的處理

if(get_global_id(0) == (get_global_size(0)-1)) 
    // do computation for rest of the work-items (leftover) 
相關問題