cuda parallel reduction

Posted deepllz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了cuda parallel reduction相关的知识,希望对你有一定的参考价值。

参考文献:https://developer.download.nvidia.cn/assets/cuda/files/reduction.pdf

文中对Scalar Reduction提出了6阶段的优化方法,其中比较关键的思想如下:

1.Avoid warp divergent

2.Sequential addressing is conflict free(我的理解就是连续寻址速度要更快)

3.Unroll the last warp(即warpReduce,这里要注意volatile关键字的作用,如果warpReduce的参数必须声明为volatile类型的)

4.Use Template to unroll all loop && avoid conditional statement(if .. else..)

5.Multiple Adds(就是在对shared_data做reduce之前,尽可能的让每个线程多加几个元素,比如shared_data大小为256,输入数组大小为2560,那么就让每个线程加10个元素,变为256个元素依次赋值到shared_data然后再做reduce)

除了Scalar Reduction还有Column Reudction、Row Reduction等,具体可以参考tensorflow源码:https://github.com/tensorflow/tensorflow/blob/master/tensorflow/core/kernels/reduction_gpu_kernels.cu.h

其中在列数或者行数少于16时,还用到了warp-primitive层级的编程技巧,具体可参考:https://devblogs.nvidia.com/using-cuda-warp-level-primitives/

原因很简单:列数小于16时,一个warp能算最少两行或者两列,因此需要将每个warp内的几个数加和,正好可以利用warp-primitive特性计算这个和.

tensorflow在内部调用了cub库提供的API(cub好像就是包装了一些cuda API),其实完全可以自己实现.

以上是关于cuda parallel reduction的主要内容,如果未能解决你的问题,请参考以下文章

深度学习部署笔记(十五): CUDA_Run_Time_API_parallel_多流并行,以及多流之间互相同步等待的操作方式

CUDA:如何使用 barrier.sync

CUDA并行程序设计系列GPU技术简介

NVIDIA Parallel Nsight 和 OpenCL

在 Matlab 中执行 CUDA 代码

一个研究将 C 程序移植到 CUDA C 并优化的案例读书笔记