我正在浏览link
提供的NVIDIA示例代码在示例内核代码(文件oclReduction_kernel.c
)中,reduce4使用
1)展开并删除线程id<的同步障碍。 32.
2)除此之外,代码使用blockSize检查对本地内存中的数据求和。我认为在OpenCL中我们有get_local_size(0/1)
来了解工作组的大小。 Block Size令我感到困惑。
我无法理解上述两点。为什么以及如何帮助优化?有关reduce5和reduce6的任何解释也会有所帮助。
答案 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
看起来是工作组的大小。