opencl中的并行和减少实现

时间:2015-07-31 15:22:47

标签: opencl gpgpu

我正在浏览link

提供的NVIDIA示例代码

在示例内核代码(文件oclReduction_kernel.c)中,reduce4使用

技术

1)展开并删除线程id<的同步障碍。 32.

2)除此之外,代码使用blockSize检查对本地内存中的数据求和。我认为在OpenCL中我们有get_local_size(0/1)来了解工作组的大小。 Block Size令我感到困惑。

我无法理解上述两点。为什么以及如何帮助优化?有关reduce5和reduce6的任何解释也会有所帮助。

1 个答案:

答案 0 :(得分:1)

您在https://docs.nvidia.com/cuda/samples/6_Advanced/reduction/doc/reduction.pdf的幻灯片21和22中已经解释了这一点,@ Marco13在评论中将其链接起来。

  
      
  • 随着减少的进行,#“活动”线程减少
  •   
    •   
    • 当s <= 32时,我们只剩下一个经线
    •   
  •   
  • 指令在warp中是SIMD同步的。
  •   
  • 这意味着当s&lt; = 32:
  • 时   
    •   
    • 我们不需要__syncthreads()
    •   
  •   
    •   
    • 我们不需要“if(tid&lt; s)”,因为它不会保存任何工作
    •   
  •   
     

如果不展开,所有warp都会执行for循环的每次迭代   如果声明

https://www.pgroup.com/lit/articles/insider/v2n1a5.htm

  

代码实际上是由32个线程组执行的,NVIDIA是什么   叫做扭曲。

     

每个核心都可以执行顺序线程,但核心可以执行   NVIDIA称之为SIMT(单指令,多线程)时尚;   同一组中的所有核心同时执行相同的指令   时间,就像经典的SIMD处理器一样。

Re 2)blockSize看起来是工作组的大小。

相关问题