![](/img/trans.png)
[英]OpenCL - how to effectively distribute work items to different devices
[英]OpenCL: What if i have more tasks then available work items?
讓我們舉個例子:
我想要同時制作矢量點積(這不是我的情況,這只是一個例子),所以我有2個較大的輸入向量和相同大小的較大的輸出向量。 可用的工作項小於這些向量的大小。 如果工作項小於向量的大小,如何在opencl中制作此點積? 這可能嗎? 還是我只想招數?
就像是:
for(i = 0; i < n; i++){
output[i] = input1[i]*input2[i];
}
n>可用工作項
如果通過“可用工作項”表示您已達到CL_DEVICE_MAX_WORK_ITEM_SIZES
給出的最大值,則始終可以多次為陣列的不同范圍排隊內核。
但是,根據您的實際工作量,使每個工作項執行更多工作可能更為明智。 在最簡單的情況下,您可以使用SIMD類型,例如float4
, float8
, float16
等,並float16
對大塊進行操作。 與往常一樣,嘗試不同方法並評估每種方法的性能是無可替代的。
分割和征服數據。 如果將工作組大小保留為全局工作大小的整數除法,則每次內核啟動時,您可以讓N個工作組啟動一次,也許有k個啟動。 因此,您應該僅使用k * workgroup_size個工作項啟動N / k個內核,並對內核中的緩沖區進行適當尋址。
當您具有每個工作組的部分點積的部分總和(具有多個組內縮減步驟)時,您可以簡單地在CPU或數據將要到達的任何設備上對它們進行求和。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.