简单描述
图形处理、也就是显示核心,又称显示核心、视觉处理器、显示芯片,是一种专门在个人电脑、工作站、游戏机和一些移动设备(如平板电脑、智能手机等)上图像运算工作的微处理器。 包括市面上的游戏本也是带有独立显卡的,而商务本和超级本是不带的,带上显卡,重量一下就上去了。
用途是将计算机系统所需要的显示信息进行转换驱动,并向显示器提供行扫描信号,控制显示器的正确显示,是连接显示器和个人电脑主板的重要元件,也是“人机对话”的重要设备之一。显卡作为电脑主机里的一个重要组成部分,承担输出显示图形的任务,对于机器运行一些大型游戏,也是必不可少的,主在看游戏对画面的渲染有没有达到一个重度,像那种像素游戏(坦克大战、俄罗斯方块),带不带显卡都不重要了,换成怪物猎人、巫师、上古卷轴这种,试下仅仅用核显来跑,全特效跑,不卡到怀疑人生才怪。还有对于从事专业图形设计的人来说显卡非常重要。
什么是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计算的性能分析
- dft离散傅里叶变换的公式如下:
X是原始数据,一个复数数组。Y = dft(X) 和 X = ifft(Y) 分别表示傅里叶变换和傅里叶逆变换。假设X的数据个数为n,那么Y的数据个数也是n,计算公式就是:
正变换:
逆变换:
其中:
2. 对于1024个浮点复数,进行一维DFT变换。在保证计算结果正确一致的前提下,这次结果用来比较下计算速度。
计算20次,将运行时间累加再计算平均值,就会得出如下统计结果:
其中,opencv是在CPU上进行多核并行计算的。cufftlib在GPU上执行计算,并没有将数据拷贝耗时计算在内。可以看出,GPU上计算的花费时间,是CPU上花费时间的一半。
- 对于1024 * 1024 的图像资源,进行2维DFT计算,在确保计算结果正确一致的前提下,比较计算速度(计算耗时)。
实验同样是进行20次计算,将运行时间累加再计算平均值。得出如下统计结果
可以看出,cufftlib 计算的耗时远远小于opencv的计算耗时,15us vs. 6ms,相差400倍,这个性能提升,哇~,可以的了,相当的可观。
- 有没发现,这里面有个问题,cufftPlan1d 和cufftPlan2d,这两个函数的运行都很耗时。对于1024x1024大小的计算来说,cufftPlan2d耗时可达168ms。这个操作,在fft的长度确定之后,只需要运行一次,所以对于特定的应用程序来说,可以在应用运行起来之时,执行一次,后面运行就很快了。
- 最大最小值计算的性能分析
- 在CPU上使用串行计算,1024x1024的图像数据(8位无符号),依次遍历每个数据,进行比较,保存最大值和最小值。
- 在第一种方式的基础上,使用openmp进行并行化处理。
- 使用GPU进行计算,主要采用先分段计算,再归约的计算方法。
对于以上3种方式,在保证结果正确一致的情况下,比较计算耗时,分别计算20次,然后计算各自的平均耗时。结果如下:
-
得出:
-
在CPU上使用omp进行并行化,计算性能最好,花费629微秒;
-
其次是cuda GPU,花费717微秒;
-
花费时间最多的是CPU串行计算,花费2.11毫秒。
-
-
这个里面GPU跟omp相比,没有优势,因为计算最大最小值的时候,需要将每个数据与其它数据进行比较,或者是与相邻的数据比较,或者是与临时最大值最小值进行比较,更新最大最小值时还需要进行同步。使得这个计算,只能在小局部内并行,最后还是需要归约。而CPU上omp计算时,多个线程间对共享资源的更新,要快很多。
- 图像滤波计算性能分析
- 图像滤波是指,使用特性的滤波核,在图像矩阵中移动,对应的计算图像中与核矩阵重叠部分与滤波核矩阵的点乘,将结果保存到图像部分矩阵的中心点。滤波核一般是小的矩阵,对于sobel滤波来说,滤波核如下:
-1 -2 -1 -1 0 1
0 0 0 以及 -2 0 2
1 2 1 -1 0 1
分别对应y方向上的二阶导,和x方向上的一阶导
-
使用1024x1024的图像进行sobel滤波计算
-
使用opencv在CPU上进行计算
-
使用cuda GPU进行计算
在保证计算结果正确一致的前提下,比较计算耗时 -
如果不把GPU的数据拷贝时间考虑在内,运行结果如下:
-
如果计算拷贝时间,将结果数据从GPU拷贝回主机的时间 计算在内,那么运行结果如下:
-
-
可以看出,如果不考虑GPU和主机之间的数据传输时间,GPU的计算性能还是很有优势,这是因为对于这个滤波计算,各个像素的计算可以实现完全的并行化,计算的结果之间没有依赖性。所以计算性能就有很大提升。
-
但是如果考虑数据传输时间,GPU计算耗时将比CPU计算耗时更长。所以在实际程序中,要考虑怎样避免数据传输(拷贝)时间影响程序的整体性能,主要的做法有:
-
让尽量多的计算在GPU上运行,让GPU的计算工作量远远大于拷贝传输数据的工作量,而且不要频繁的拷贝传输,这样就让拷贝传输耗时在整体耗时中占比减小,从而对整体性能影响不大。一个极端的情况就是,整个程序的计算都在GPU上进行,在开始的时候,将数据拷贝传输到GPU,然后所有计算都在GPU上进行,最后将结果拷贝回主机。
-
在CPU上启动多线程,一个线程在拷贝的过程中,另一个线程在执行计算,这样,计算与拷贝的时间就重合了,消除了一部分耗时。
-
使用cuda GPU中流(stream)的机制,对GPU的操作,使用异步方式,在一个流进行拷贝的时候,另一个流进行计算。
-