[英]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.