Skip to content

Commit 4245877

Browse files
committed
把目前做的cuda部分提交了,后面还会补充
1 parent 085f152 commit 4245877

File tree

2 files changed

+52
-0
lines changed

2 files changed

+52
-0
lines changed

docs/wiki/cuda-project.md

+51
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
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+

mkdocs.yml

+1
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,7 @@ nav:
182182
- Latex环境配置及编译优化: wiki/latex-manual.md
183183
- c++并行编程入门: wiki/parallel_coding.md
184184
- 从内存到屏幕:GUI 显示手段的进化史: wiki/how-gui-work.md
185+
- cuda编程(待完善): wiki/cuda-project.md
185186
- High Light: page/high-light.md
186187
- Contirbutor: page/contributor.md
187188
- How-To: page/to-contributors.md

0 commit comments

Comments
 (0)