CUDA 学习(二十一)优化策略6: 资源竞争

Posted tiemaxiaosu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CUDA 学习(二十一)优化策略6: 资源竞争相关的知识,希望对你有一定的参考价值。

一、识别瓶颈

        分析瓶颈工具:

        (1)、Visual Profiler

         对已实现的代码进行分析,我们首先可以考虑的就是SDK 中提供的那些分析工具。比如,NVIDIA Visual Profile。这是一款多平台的工具。它能指出在我们内核中哪些是错误的,并告诉我们该如何改进。

        (2)、Parallel Nsight

         尽管Visual Profiler 很好用,但遗憾的是,它只能为我们提供这么多的信息。如果想进一步得到一些分析信息,则需要更高级的分析工具,例如 Parallel Nsight。 Parallel Nsight 是一款仅支持Windows 平台的可视化分析器与调试器。Parallel Nsight 是一款比Visual Profiler 更为深入分析工具。它会展示更多有关内核的信息以及内核做了哪些工作。


二、解析瓶颈

        以下三种常见类型的瓶颈: (1)、PCI-E 传输瓶颈;(2)、内存带宽瓶颈;(3)、计算瓶颈

1、PCI-E 传输瓶颈

      PCI-E 传输瓶颈往往是需要考虑的一个关键因素。PCI-E 总线带宽是有限的,PCI-E 2.0 的总线带宽最高可达到约5GB/s,但这也依赖于主机端硬件。然而,要实现这个峰值,则需要使用锁页内存并且数据传输的大小必须适当。在一个计算机节点增加更多的GPU 通常会降低总体带宽,但却实现了GPU 的数量的增加。

      压缩技术是一种可以明显增加PCI-E 传输速率硬限制的技术。

      使用流使计算与数据传输重叠进行或使用“零复制内存”技术。当PCI-E 的传输时间超过内核执行时间时,使用这种技术可以完全隐藏计算时间。

2、内存瓶颈

       接下来需要考虑的问题是全局内存的内存带宽。从时间和功率消耗的角度来看,移动数据的开销是非常大的。因此,考虑高效的数据存取以及数据重用是在选择一个合适算法的基本标准。

        当考虑内存时,也需要考虑线程间的合作问题,而且线程合作最好限制在单一的线程块内。假设线程通信局限于小范围的通用算法比假设每个线程可以与所有线程对话的通用算法更有用。

尽管需要大量的内存事务,内存合并还是实现高内存吞吐量的关键。在费米和开普勒结构的设备上,当使用32位数值时获取全部带宽需要整个GPU几乎完全充满线程,不存在任何空闲(每个SM 驻村48-64个线程束,即处理1536-2048个线程)。通过使用各种向量类型增加事务处理规模,从而优化指令并行及内存带宽。对于许多程序而言,每个线程处理4个元素比处理一个元素的效果好。

3、计算瓶颈

(1)、复杂性

       尽管GPU 有巨大的计算吞吐量,但仍有许多超出了GPU 的计算能力范围。由于使用了缓存,通过将一级缓存的大小设置为48KB 并且不使用共享内存,成功地消除了大量复杂的控制复杂性。复杂性的消除通常有助于对涉及计算边界的内核进行加速优化。

(2)、指令吞吐量

       所有计算能力的计算机几乎都能实现每个线程、每个时钟周期执行一条指令的吞吐量。记住,是每个线程。若按绝对数目计算,则需要用每个线程束包含的线程乘以每个SM 同时处理的线程束在乘以GPU 上SM 的数目。

(3)、同步和原子操作

        在许多算法中都需要同步点。一个线程执行同步的开销并不大,但却会潜在地影响性能。除非每个线程块包含的线程数特别多,否则CUDA 调度程序会试图使每个SM 最大的限度地调度更多线程块,即每个SM 调度处理16个线程块。随着每个线程块线程数量的增加,SM 能够调度的线程数量也相应减少。这并不会对线程造成很糟的影响,但如果结合同步,则可导致SM阻塞。

(4)、控制流

       分支产生的每种可能的情况都需要单独执行,因此会对执行时间产生严重影响。编译器意识到这一点后,于是使用了一种名为分支断定技术。





以上是关于CUDA 学习(二十一)优化策略6: 资源竞争的主要内容,如果未能解决你的问题,请参考以下文章

CUDA 学习(二十二)优化策略7: 自调优应用程序

CUDA 学习(二十二)优化策略7: 自调优应用程序

Hive学习之路 (二十一)Hive 优化策略

CUDA 学习(二十)优化策略5: 算法

CUDA 学习(二十)优化策略5: 算法

Docker 与 K8S学习笔记(二十一)—— Pod生命周期重启策略与健康检查