簡體   English   中英

OpenCL 2.x-減少總和功能

[英]OpenCL 2.x - Sum Reduction function

從上一篇文章: 最終的減少戰略中 ,我想知道OpenCL 2.x (不是以上上一篇文章的主題1.x) 提供的最后功能 ,尤其是關於原子功能允許執行數組的約簡(在我的情況下為總和)。

有人告訴我,OpenCL 1.x原子函數( atom_add )的性能很差,我可以對其進行檢查,因此,我正在尋找一種方法來獲得final reduction function的最佳性能(即,對應於每個工作組)。

我回想起了我目前使用的典型的內核代碼:

__kernel void sumGPU ( __global const double *input, 
                       __global double *partialSums,
               __local double *localSums)
 {
  uint local_id = get_local_id(0);
  uint group_size = get_local_size(0);

  // Copy from global memory to local memory
  localSums[local_id] = input[get_global_id(0)];

  // Loop for computing localSums
  for (uint stride = group_size/2; stride>0; stride /=2)
     {
      // Waiting for each 2x2 addition into given workgroup
      barrier(CLK_LOCAL_MEM_FENCE);

      // Divide WorkGroup into 2 parts and add elements 2 by 2
      // between local_id and local_id + stride
      if (local_id < stride)
        localSums[local_id] += localSums[local_id + stride];
     }

  // Write result into partialSums[nWorkGroups]
  if (local_id == 0)
    partialSums[get_group_id(0)] = localSums[0];
 }             

如您所見,在內核代碼執行結束時,我得到了包含所有部分和的數組partialSums[number_of_workgroups]

您能告訴我如何執行此數組的第二次也是最后一次還原,以最大可能的性能使用OpenCL 2.x所提供的功能。 一個經典的解決方案是使用CPU執行最后的還原,但理想情況下,我想直接使用內核代碼來完成

歡迎提供代碼段的建議。

最后一點,我正在使用以下模型在MacOS High Sierra 10.13.5上工作:

模型硬件

可以在我的硬件MacOS型號上安裝OpenCL 2.x嗎?

問候

應避免使用原子功能,因為與並行歸約內核相比,原子功能會損害性能。 您的內核看起來處於正確的軌道上,但是您需要記住,您必須多次調用它。 不要在主機上執行最終的總和(除非您之前還原的數據量很小)。 也就是說,您需要繼續調用它,直到您的本地大小等於全局大小為止。 由於無法在工作組之間進行同步,因此無法對大量數據進行一次調用。

另外,您要小心設置適當的工作組大小(即本地大小),這取決於本地和全局內存的吞吐量和延遲。 不幸的是,據我所知,沒有辦法通過OpenCL在自我分析代碼之外確定這一點,盡管OCL為您提供JIT編譯功能,但編寫起來並不難。 通過經驗測試,我發現您應該在遭受太多銀行沖突(本地大小太大)與全局內存延遲懲罰(本地大小太小)之間找到一個甜蜜點。 最好先做一個基准測試,以確定您的縮小的最佳本地大小,然后再使用該本地大小進行將來的縮小。

編輯:還應注意,將內核調用鏈接在一起的最佳方法是通過OpenCL事件。

暫無
暫無

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

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