快速评估算法对GPU性能需求(入门篇)

转载自:知乎
作者:Keepin

GPU是高性能计算领域非常普遍的一个硬件加速器。不管是在移动端还是在pc端,服务端经常需要用GPU做一些复杂算法的加速。加速后的不仅体验流畅,而且能节省一些硬件资源,可谓一举两得。然而在开始优化前,人们总是希望能更好的预先评估这个算法需要多大的GPU算力需求,以便于确定是否能接受额外的成本。由于算法加速更多的是采用GPU的通用计算,因此这篇文章从通用计算角度概述几点重点方法。

一、GPU指标

GPU有好多指标,这些指标看起来如果没有仔细研究,单纯从数据来看,往往是哦啊额。那对于通用计算有哪些重要指标要看呢?首先是算力指标,算力代表着一个GPU的最大运算能力;带宽指标,如果是移动端的话,带宽比较吃紧,而且还得跟cpu等其他模块抢带宽,独立显卡相对好一些,有自己得显存,带宽很高,带宽则是整个GPU得IO吞吐能力,对于带宽密集型的算法,就得从带宽的角度去评估;GPU微架构,微架构其实影响不大,但是需要算法要可并行。从事高性能计算多年,只要一个算法可并行,基本就是折腾IO和算力了。

二、算力指标

对于算力这个指标,大多硬件厂商给出的是GPU的最大性能值。比如RTX2080ti,如果经过查阅相关文档不难得到这样一个GFLOPS数据表格:

RTX 2080 TI

1、从上述的表格中可以看出,单精度的性能和双精度的性能差距巨大,将近32倍。所以一个算法在评估性能需求的时候对于精度要求也是非常关键的,如果没有必要用高精度的话,甚至能使用半精度的情况,对这款gpu显然效率更高。

2、假设一个算法的算力需求是30g的半精度,按照理论值一秒就可以运行783帧。

3、当然肯定还有一个非常关心的问题,如何计算算法的算力需求?算力需求初步评估可以这样计算:加减乘逻辑操作这些基本都可以算一个flop。至于除法比较比较复杂可能需要多条指令完成,如果有更复杂的sin,cos计算也会更加复杂,这个具体看情况,那这种情况下最好还是实测下。

三、带宽指标

对于计算密集型的算法,使用算力去评估算法的硬件需求;然而并不是所有的算法都是计算密集型的,也会存在一些带宽密集型的(确切的说是IO密集型的算法),那么这些算法就要注重带宽方面得参数。就按照上述的RTX 2080 Ti来说,峰值带宽是616GB/s。

对于带宽的计算最简单的方法就是假设算法是并行的,单个像素可独立计算,且相邻水平方向的像素可以连着计算。比如说1920×1080的单通道图像,我们对每个像素加1操作,那我们的读带宽是1920x1080x1约为2m数据,写出的带宽也约为2m带宽。一帧需要4m带宽。对于2080TI来说4M带宽是很小,耗时自然也很少。

当然,上述的计算方法非常的简单,主要是算法简单,对于一些复杂算法来说,有可能带宽会非常大,最近就遇到一个复杂算法,一帧算法带宽需求达到37000GB。优化就非常困难。

四、其他

从大方向来说,算力和带宽基本可以很好的初步评估gpu性能需求。当然,算法是固定的,对于特定的算法通常都可以特定的优化,这也是高性能从业者所需要考虑的要点。通过分析算法的特定性,来进一步优化。

算力和带宽通常来说通过GPU并联还是很有可能解决性能不足问题的。但是自然要增加成本。

带宽方面,这些年出现了HBM的显存,能够比较大的提升单卡的带宽,不过HBM显存的GPU成本也比较高,但是对于带宽密集型的可以考虑HBM的显存,相比多卡可能更划算。比如AMD的Radeon VII显存带宽达到1028GB。如果是带宽密集型的算法,两个2080 ti的带宽也才1232GB。未尝不是个好的替代方法。

推荐专栏文章

  • OpenCV中支持的人脸检测方法整理与汇总
  • 移动和嵌入式人体姿态估计
  • 【项目实践】从零开始学习SSD目标检测算法训练自己的数据集(附注释项目代码)

更多嵌入式AI算法部署等请关注极术嵌入式AI专栏

发表评论

邮箱地址不会被公开。 必填项已用*标注