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 进行授权

