文章

CUDA编程过程中的性能优化

1. 硬件结构及编程模型

硬件层次结构如下:

nvidia-hardware-hierarchy

硬件层次结构模型为:GPU device -> SM 矩阵 -> SP 矩阵。一个SP处理器(即GPU Core)包含一个浮点处理单元(有些GPU还包含一个Tensor Core)。

软件/硬件层次结构对应关系:

software-hardware-hierarchy

由于有两层结构,CUDA runtime将数据作了两层划分:gridblock,分别对应SM 矩阵的调度与SP 矩阵的调度。

其中,SP的调度以warp为单位,如32个线程组成一个warp,对应为硬件上的SM处理器中的完整计算单元。

2. Bank Conflicts (Shared Memory)

每个SM中,Shared Memory被分为32个bank,存储以word4字节)为单位,按顺序映射到这个32个bank上(第iword存放在第(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

学习资料

本文由作者按照 CC BY 4.0 进行授权