繁体   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