Skip to content

Latest commit

 

History

History
108 lines (66 loc) · 5.73 KB

README.md

File metadata and controls

108 lines (66 loc) · 5.73 KB

Optimizing Reduce Kernel in CUDA Step by Step

Learning Resources

官方文档

博客&教程

与具体优化相关的资料会在小节中给出。

Reduce Kernel

reduce_v1

无优化,每个 thread 对应一个输入元素。 对应官方PDF Reduction #1中的Baseline版本。

reduce_v2

缩减未使用的 thread,第一次迭代时数组范围内所有线程都进行read和reduce。每次迭代每个 thread 对应一次 reduce 操作。 对应官方PDF Reduction #4。

reduce_v3

交错寻址(Interleaved Addressing),尽可能确保相邻的thread在相同的条件分支内,即尽可能确保一个 warp 内所有 thread 在相同分支内,缓解 warp divergence。 对应官方PDF Reduction #2。

reduce_v4

调换相加的顺序,让一个 warp 内相邻的 thread 访存位置连续,这样能防止同一个 warp 内的 thread 在相同时刻访问相同 bank 的内存。减少 bank conflict。 对应官方PDF Reduction #3。

v4版本的顺序有问题,应该先使用 shared memory,再考虑减少 bank conflict。

reduce_v5

使用 shared memory,减少全局内存访问次数。但是每个 thread 读取一个全局内存数据。

reduce_v6

使用 shared memory,同时在从全局内存读取数据时,进行一次 reduce 操作。减少空闲线程。 对应官方PDF Reduction #4。

reduce_v7

线程粗化,thread coarsening,即一个 thread 读取并处理多个全局内存数据。 对应官方PDF Reduction #7。

reduce_v8

循环展开最后一个 warp 的 reduce。 对应官方PDF Reduction #5。

reduce_v9

使用 warp shuffle 指令,直接在寄存器内移动数据,减少 shared memory 的使用。

reduce_v10

Pytorch 的 block reduce 写法,即一个 block 内进行两次 warp reduce。

reduce_v11

Pytorch 的 block reduce 写法,但是加点 C++ 模板,并且不限输入数据量。注意算法上不完全一样。

reduce_v12

Pytorch 的 block reduce 写法,使用向量化访存读取数据。

reduce_torch

使用 Pytorch 的 cpp extension 在 python 内调用自定义的 reduce kernel。

TODO

  • 使用 Makefile / CMake 管理编译
  • 性能分析