簡體   English   中英

OpenCL:如果我還有更多任務而不是可用工作項怎么辦?

[英]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類型,例如float4float8float16等,並float16對大塊進行操作。 與往常一樣,嘗試不同方法並評估每種方法的性能是無可替代的。

分割和征服數據。 如果將工作組大小保留為全局工作大小的整數除法,則每次內核啟動時,您可以讓N個工作組啟動一次,也許有k個啟動。 因此,您應該僅使用k * workgroup_size個工作項啟動N / k個內核,並對內核中的緩沖區進行適當尋址。

當您具有每個工作組的部分點積的部分總和(具有多個組內縮減步驟)時,您可以簡單地在CPU或數據將要到達的任何設備上對它們進行求和。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM