File tree 2 files changed +52
-0
lines changed
2 files changed +52
-0
lines changed Original file line number Diff line number Diff line change
1
+ ---
2
+ template : overrides/main.html
3
+ ---
4
+
5
+ # cuda项目:优化softmax
6
+
7
+ ## 优化策略概览
8
+ 这个项目需要对 softmax 这一深度学习中常用的函数进行 cuda 层面的
9
+ 并行优化。
10
+ 一般来说,softmax 的计算逻辑可以分为下面三个步骤:
11
+ 1 . 对于固定的某行,需要遍历当前行的所有元素获取最大值;
12
+ 2 . 获得最大值以后,需要计算数值和;
13
+ 3 . 指数变换缩放,得到最终的数值结果。
14
+ 按照 softmax 的计算过程,我尝试了以下几种优化方式,最终性能均优于
15
+ baseline,且不同的并行策略在不同数据规模下各有优势 (由于 softmax 的
16
+ 计算特性,网格和线程块只使用一维的):
17
+ 1 . 使用不同并行规模: 1 个 warp 处理 1 行,1 个 warp 处理 2 行,1 个
18
+ warp 处理 4 行
19
+ 2 . 使用 __ shfl_down_sync() 和 __ shfl_sync() 原语进行向量规约,在
20
+ 1 个 warp 处理 1 行时可以使数据储存在寄存器内 (之前是存在共享内
21
+ 存里),优化访存。
22
+ 3 . 利用 __ shfl_down_sync() 和 __ shfl_sync()的同步特性, 减少耗时
23
+ 较多的 syncthreads()
24
+ 4 . 利用 float4 对每一种并行策略进行访存优化
25
+ 5 . 减少 CPU 和 GPU 之间来回搬数据的次数和 malloc 次数,在所有策
26
+ 略执行之前先 malloc 将数据搬到 GPU 上
27
+ ## 优化方法实现
28
+ 下面提供每一种策略的核函数实现,具体代码放在GitHub上了(https://github.com/WenhaoHe02/cuda-learning),此处仅提供目录
29
+ ### 每个 warp 处理一行数据
30
+ #### 普通版本
31
+ #### float4版本
32
+
33
+ ### 每个 warp 处理两行数据
34
+ ### 普通版本
35
+ ### float4版本
36
+
37
+ ### 每个 warp 处理四行数据
38
+ ### 普通版本
39
+ ### float4版本
40
+
41
+ ## 结果分析
42
+ ** 运行环境:Geforce RTX 4060 8G**
43
+ 综合来看,1 个 warp 处理一行的表现最好,但是在行数比列数大得多
44
+ 的情况下(如 2024,32 1024,32)的情况下,1 个 warp 处理多行的效果更
45
+ 好,并且在这个项目的数据范围内,一个 warp 处理 4 行优于一个 warp 处
46
+ 理 2 行。此外,使用 float4 优化后的效果几乎总是优于不使用的情况。根
47
+ 据所有数据规模,最好的优化效果相比于 baseline 每次都有 2-8 倍的性能
48
+ 提升 (详细数据见下一部分)
49
+ ## 数据展示
50
+ 同样放到GitHub上了(https://github.com/WenhaoHe02/cuda-learning )
51
+
Original file line number Diff line number Diff line change 182
182
- Latex环境配置及编译优化 : wiki/latex-manual.md
183
183
- c++并行编程入门 : wiki/parallel_coding.md
184
184
- 从内存到屏幕:GUI 显示手段的进化史 : wiki/how-gui-work.md
185
+ - cuda编程(待完善) : wiki/cuda-project.md
185
186
- High Light : page/high-light.md
186
187
- Contirbutor : page/contributor.md
187
188
- How-To : page/to-contributors.md
You can’t perform that action at this time.
0 commit comments