CUDA编程过程中的性能优化
1. 硬件结构及编程模型
硬件层次结构如下:
硬件层次结构模型为:GPU device
-> SM 矩阵
-> SP 矩阵
。一个SP
处理器(即GPU Core
)包含一个浮点处理单元(有些GPU
还包含一个Tensor Core
)。
软件/硬件层次结构对应关系:
由于有两层结构,CUDA runtime
将数据作了两层划分:grid
,block
,分别对应SM 矩阵
的调度与SP 矩阵
的调度。
其中,SP
的调度以warp
为单位,如32个线程组成一个warp
,对应为硬件上的SM
处理器中的完整计算单元。
2. Bank Conflicts (Shared Memory)
每个SM
中,Shared Memory
被分为32个bank
,存储以word
(4字节
)为单位,按顺序映射到这个32个bank
上(第i
个word
存放在第(i % 32)
个bank
上)。这样一个时钟周期,就可以访问128字节
。
所谓Bank Conflicts
,就是warp
访问内存时,没有遵照bank
的访问顺序,导致需要多次访问内存。如下情况会产生Bank Conflicts
:
warp
中线程(同一个线程,或不同线程),访问一个bank
中的不同地址;warp
中线程,访问到下一个bank
簇–即另外一个32个word
组的起始地址;
如下情况,Bank Conflicts
不会产生:
warp
中线程,访问地址分别对应到bank
簇的每个bank
,不论是顺序,还是错位;warp
中多个线程,访问同一个bank
中的相同地址–使用boardcast
分发相同地址数据到多个线程;
如何避免Bank Conflicts
:首先,根据warp
需要,配置bank
使用4字节
/8字节
。其次,如果需要,使用padding
。
- cuda程序优化-2.访存优化
- 16.4.3. Shared Memory
- How to understand the bank conflict of shared_mem
- CUDA shared memory bank 冲突
学习资料
本文由作者按照 CC BY 4.0 进行授权