繁体   English   中英

opencl中的并行和减少实现

[英]parallel sum reduction implementation in opencl

我正在浏览链接中提供的NVIDIA示例代码

在示例内核代码(文件oclReduction_kernel.c )中,reduce4使用以下技术:

1)展开和删除线程ID <32的同步屏障。

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

我无法理解上述两点。 为什么这些事情以及如何帮助优化? 对reduce5和reduce6的任何解释也将有所帮助。

您已经在https://docs.nvidia.com/cuda/samples/6_Advanced/reduction/doc/reduction.pdf的幻灯片21和22中进行了解释,其中@ Marco13在注释中进行了链接。

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

在不展开的情况下,所有扭曲都将执行for循环和if语句的每个迭代

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

该代码实际上以32个线程为一组执行,这被NVIDIA称为warp。

每个内核都可以执行一个顺序线程,但是内核以NVIDIA所谓的SIMT(单指令,多线程)方式执行。 与传统SIMD处理器非常相似,同一组中的所有内核都同时执行同一条指令。

关于2) blockSize看起来应该是工作组的大小。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM