CUDA程序性能的提升 与 流
1. CUDA程序性能的提升
- 在本节中,我们会看到用来遵循的基本的一些性能来提升准则,我们会逐一解释它们
1.1 使用适当的块数量和线程数量
- 研究表明,如果块的数量是 GPU 的流多处理器数量的两倍,则会给出最佳性能,不过,块和线程的数量与具体的算法实现有关
- GPU 的流多处理器则可以通过获取设备属性的方法获得
1.2 最大化数学运算效率
-
数学运算效率的定义是,数学运算操作和访存操作的比率
-
常见的内核执行有3个瓶颈:卡在计算瓶颈上、卡在访存上和卡在延迟掩盖上:
- 如果卡在计算上,则应当考虑将一些计算等效的转换成访存,例如一些运算可以尝试转换成存储器查表
- 如果卡在访存上,则可以将一些访存转换成对应的计算,例如一些数据不是重新载入,而是直接计算出来
-
缓存的使用也有助于减少存储器访问时间,最终一定程度地辅助达成减少(内核的)全局内存的带宽需求就能减少花费在访存上的时间的目的。高效的使用存储器对提升CUDA程序性能非常重要,当显存带宽是瓶颈的时候,减少带宽需求有助于提升性能
1.3 使用合并的或跨步式的访存
- 合并访存大致意味着线程束(warp)整体读取或者写入连续的存储器区域,这种对存储器的访问对GPU来说是最高效的。
- 如果 warp 的线程固定步长地离散式访问某段存储器区域,这叫做跨步式访存,