GPU计算(一)

简单描述

图形处理、也就是显示核心,又称显示核心、视觉处理器、显示芯片,是一种专门在个人电脑、工作站、游戏机和一些移动设备(如平板电脑、智能手机等)上图像运算工作的微处理器。 包括市面上的游戏本也是带有独立显卡的,而商务本和超级本是不带的,带上显卡,重量一下就上去了。

用途是将计算机系统所需要的显示信息进行转换驱动,并向显示器提供行扫描信号,控制显示器的正确显示,是连接显示器和个人电脑主板的重要元件,也是“人机对话”的重要设备之一。显卡作为电脑主机里的一个重要组成部分,承担输出显示图形的任务,对于机器运行一些大型游戏,也是必不可少的,主在看游戏对画面的渲染有没有达到一个重度,像那种像素游戏(坦克大战、俄罗斯方块),带不带显卡都不重要了,换成怪物猎人、巫师、上古卷轴这种,试下仅仅用核显来跑,全特效跑,不卡到怀疑人生才怪。还有对于从事专业图形设计的人来说显卡非常重要。

什么是GPU加速计算?

GPU 加速计算是指同时利用图形处理器 (GPU) 和 CPU,加快科学、分析、工程、消费和企业应用程序的运行速度。GPU 加速器于 2007 年由 NVIDIA® 率先推出,现已在世界各地为政府实验室、高校、公司以WW中小型企业的高能效数据中心提供支持。GPU 能够使从汽车、手机和平板电脑到无人机和机器人等平台的应用程序加速运行.

GPU如何加快软件应用程序的运行速度

GPU 加速计算可以提供非凡的应用程序性能,能将应用程序计算密集部分的工作负载转移到 GPU,同时仍由 CPU 运行其余程序代码。从用户的角度来看,应用程序的运行速度明显加快,因为将图像处理这些容量大的计算都给分担的出去了,整体执行的速度也就上去了。

在这里插入图片描述

GPU与CPU性能比较

理解 GPU 和 CPU 之间区别的一种简单方式是比较它们如何处理任务。CPU 由专为顺序串行处理而优化的几个核心组成,而 GPU 则拥有一个由数以千计的更小、更高效的核心(专为同时处理多重任务而设计)组成的大规模并行计算架构。

在这里插入图片描述
GPU 拥有数以千计的核心,可高效地处理并行任务

在这里插入图片描述

在需要GPU进行运算时,以NVIDIA推出的CUDA(Compute Unified Device Architecture)为例,整体的原理如下:
在这里插入图片描述
整体分为4步:

  • 从主机内存将需要处理的数据copy到GPU的内存
  • CPU发送数据处理执行给GPU
  • GPU执行并行数据处理
  • 将结果从GPU内存copy到主机内存

CUDA提供了对于一般性通用需求的大规模并发编程模型,使用户可以对NVIDIA GPU方便的对于 GPU进行并发性编程。如果进行编译优化会在特定操作系统里面把计算并行化分配到GPU的多个core里面,由于GPU有多个core(上千个),所以并发度大大提高,运算效率会比CPU高。

GPU和CPU计算能力比较

测试环境:
CPU:Intel®_Core™i7-9700_CPU@_3.00GHz
GPU:NVIDIA GeForce RTX 2080Ti

  • FFT计算的性能分析
  1. dft离散傅里叶变换的公式如下:

X是原始数据,一个复数数组。Y = dft(X) 和 X = ifft(Y) 分别表示傅里叶变换和傅里叶逆变换。假设X的数据个数为n,那么Y的数据个数也是n,计算公式就是:
正变换:
在这里插入图片描述
逆变换:
在这里插入图片描述
其中:
在这里插入图片描述
2. 对于1024个浮点复数,进行一维DFT变换。在保证计算结果正确一致的前提下,这次结果用来比较下计算速度。
计算20次,将运行时间累加再计算平均值,就会得出如下统计结果:

在这里插入图片描述

其中,opencv是在CPU上进行多核并行计算的。cufftlib在GPU上执行计算,并没有将数据拷贝耗时计算在内。可以看出,GPU上计算的花费时间,是CPU上花费时间的一半。

  1. 对于1024 * 1024 的图像资源,进行2维DFT计算,在确保计算结果正确一致的前提下,比较计算速度(计算耗时)。

实验同样是进行20次计算,将运行时间累加再计算平均值。得出如下统计结果
在这里插入图片描述

可以看出,cufftlib 计算的耗时远远小于opencv的计算耗时,15us vs. 6ms,相差400倍,这个性能提升,哇~,可以的了,相当的可观。

  1. 有没发现,这里面有个问题,cufftPlan1d 和cufftPlan2d,这两个函数的运行都很耗时。对于1024x1024大小的计算来说,cufftPlan2d耗时可达168ms。这个操作,在fft的长度确定之后,只需要运行一次,所以对于特定的应用程序来说,可以在应用运行起来之时,执行一次,后面运行就很快了。
  • 最大最小值计算的性能分析
  1. 在CPU上使用串行计算,1024x1024的图像数据(8位无符号),依次遍历每个数据,进行比较,保存最大值和最小值。
  2. 在第一种方式的基础上,使用openmp进行并行化处理。
  3. 使用GPU进行计算,主要采用先分段计算,再归约的计算方法。

对于以上3种方式,在保证结果正确一致的情况下,比较计算耗时,分别计算20次,然后计算各自的平均耗时。结果如下:

在这里插入图片描述

  1. 得出:

    • 在CPU上使用omp进行并行化,计算性能最好,花费629微秒;

    • 其次是cuda GPU,花费717微秒;

    • 花费时间最多的是CPU串行计算,花费2.11毫秒。

  2. 这个里面GPU跟omp相比,没有优势,因为计算最大最小值的时候,需要将每个数据与其它数据进行比较,或者是与相邻的数据比较,或者是与临时最大值最小值进行比较,更新最大最小值时还需要进行同步。使得这个计算,只能在小局部内并行,最后还是需要归约。而CPU上omp计算时,多个线程间对共享资源的更新,要快很多。

  • 图像滤波计算性能分析
  1. 图像滤波是指,使用特性的滤波核,在图像矩阵中移动,对应的计算图像中与核矩阵重叠部分与滤波核矩阵的点乘,将结果保存到图像部分矩阵的中心点。滤波核一般是小的矩阵,对于sobel滤波来说,滤波核如下:

-1 -2 -1 -1 0 1

0 0 0 以及 -2 0 2

1 2 1 -1 0 1

分别对应y方向上的二阶导,和x方向上的一阶导

  1. 使用1024x1024的图像进行sobel滤波计算

    • 使用opencv在CPU上进行计算

    • 使用cuda GPU进行计算
      在保证计算结果正确一致的前提下,比较计算耗时

    • 如果不把GPU的数据拷贝时间考虑在内,运行结果如下:
      在这里插入图片描述

    • 如果计算拷贝时间,将结果数据从GPU拷贝回主机的时间 计算在内,那么运行结果如下:
      在这里插入图片描述

  2. 可以看出,如果不考虑GPU和主机之间的数据传输时间,GPU的计算性能还是很有优势,这是因为对于这个滤波计算,各个像素的计算可以实现完全的并行化,计算的结果之间没有依赖性。所以计算性能就有很大提升。

  3. 但是如果考虑数据传输时间,GPU计算耗时将比CPU计算耗时更长。所以在实际程序中,要考虑怎样避免数据传输(拷贝)时间影响程序的整体性能,主要的做法有:

    • 让尽量多的计算在GPU上运行,让GPU的计算工作量远远大于拷贝传输数据的工作量,而且不要频繁的拷贝传输,这样就让拷贝传输耗时在整体耗时中占比减小,从而对整体性能影响不大。一个极端的情况就是,整个程序的计算都在GPU上进行,在开始的时候,将数据拷贝传输到GPU,然后所有计算都在GPU上进行,最后将结果拷贝回主机。

    • 在CPU上启动多线程,一个线程在拷贝的过程中,另一个线程在执行计算,这样,计算与拷贝的时间就重合了,消除了一部分耗时。

    • 使用cuda GPU中流(stream)的机制,对GPU的操作,使用异步方式,在一个流进行拷贝的时候,另一个流进行计算。

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值