图形处理器(英语:Graphics Processing Unit,缩写:GPU),又称显示核心、视觉处理器、显示芯片,是一种专门在个人电脑、工作站、游戏机和一些移动设备(如平板电脑、智能手机等)上图像运算工作的微处理器。
图形处置单元(或简称GPU)会卖力处置从PC外部传送到所衔接表现器的一切内容,不管你在玩游戏、编纂视频或只是盯着桌面的壁纸,一切表现器中表现的图象都是由GPU停止衬着的。本文体系极客将向人人先容甚么是GPU、它是若何事情的,和为何要为游戏和图象密集型应用程序设置装备摆设公用显卡。
对通俗用户来讲,现实上不消要自力显卡就能够向表现器「供给」内容。像笔记本电脑或平板用户,平日CPU芯片都邑集成GPU内核,也便是人人熟称的「核显」,如许便可认为对表现请求不高的低功耗装备供给更好的性价比。
正因如斯,部门笔记本电脑、平板电脑和某些PC用户来讲,要想将其图形处置器进级到更高级别也很艰苦,乃至不太能够。这就会招致游戏(和视频编纂等)机能欠安,只能将图形品质设置低落能力事情。对此类用户而言,只要在主板支撑和余暇空间充足的情况下,增加新显卡才能够或许把(游戏)表现体验进步到一个新的程度。
GPU发展和现状
1. GPU原来就是为了加速3D渲染的,后来被拿过来做计算。
2. 现在GPU可以支持通用的指令,可以用传统的C和C++,还有Fortran来编程。
3. 现在单个高端GPU的性能已经达到了传统多核CPU集群的性能
4. 有的应用通过GPU加速相比传统的多核CPU来说可以达到100X的加速。对某些特定应用来说GPU还是更适合的。
GPU编程模型
1. 在GPU中,工作的分配是通过在调度空间上并行地应用或者映射一个函数(或者叫做kernel)。举例来说,一个矩阵中的每一个点就是调度空间。
2. kernel就是描述在一个线程在调度空间中的每一个点要完成的工作。在调度空间中,每一个点都要启动一个线程。
3. 由于GPU是在单个PCI-e卡上的协处理器,数据必须通过显式地从系统内存拷贝到GPU板上内存。
4. GPU是以SIMD的多个group的形式组织的。在每一个SIMD的group(或者叫warp,在NIVIDA CUDA编程中为32个线程)中,所有的线程在lockstep中执行相同的指令。这样的在lockstep中执行相同指令的多个线程就叫做warp,虽然分支是被允许的,但是如果同一个warp中的线程出现不同的执行路径,会带来一些性能开销。
4. 对于memory-bound的应用来说,可能的话,同一个warp中的所有线程应当访问相邻的数据元素,同一个warp中相邻的线程应当访问相邻的数据元素。这可能要对数据布局和数据访问模式进行重新安排。
5. GPU有多个内存空间可用于开发数据访问模式。除了golbal memory以外,还有constant memory(read-only, cached),,texture memory(read-only, cached, optimized for neighboring regions of an array)和per-block shared memory(a fast memory space within each warp processor, managed explicitly by the programmer)。
6. GPU编程有两个主要平台,一个是OpenCL,一个编程方式类似OpenGL的产业标准,还有另一个是为了C/C++ Fortran的CUDA,在NVIDIA的GPU上编程。
7. OpenCL/CUDA编译器并不是把C代码转换成CUDA代码,编程人员最主要的工作还是选择算法和数据结构。例如在GPU上,基数排序和归并排序要比堆排序和快速排序好。Some programming effort is also required to write the necessary CUDA kernel(s) as well as to add code to transfer data to the GPU,launch the kernel(s), and then read back the results from the GPU.
什么应用适合GPU
1. 内核中有豪多并行线程的应用
2. 对于线程间的数据交换都发生在kernel调度空间中的相邻线程之间的应用,因为这样就可以用到per-block shared memory.
3. 数据并行的应用,多个线程做相似工作,循环是数据并行的主要来源。
4. 那些能得到很好的天然硬件支持的应用,如倒数和反平方根,不过在编程中要打开“fastmath”选项,确保使用硬件支持功能。
5. 需要对每个数据元素做大量的计算,或者能够充分利用宽内存接口(wide memory interface这里有疑问)
6. 做同步操作较少的应用。
什么应用不适合GPU
1. 并行度小的应用,如需要的线程数小于100个,那么使用GPU加速效果不明显
2. 不规则的任务并行---尽管应用需要很多线程,但是这些线程都做不同的工作,那么GPU不能得到有效的利用。不过这也依赖于具体工作,多久对线程调度一次,加速的可能仍然存在。
3. 频繁的全局同步,这要求全局的barrier,带来很大性能开销。
4. 在线程之间,会出现随机的点对点同步的应用。GPU对这个的支持不好,通常需要在每次同步的时候做一个全局barrier,如果要利用GPU,最好重构算法避免出现这个问题。
5. 要求计算量(相比于数据传输量)少的应用。尽管在CPU+GPU计算结构中,GPU可以带来计算性能的提升,但是这些提升都被向GPU传输数据所消耗的实践覆盖了。举个例子,对于两个向量求和运算,如果非常大的向量的话,一般都选择在CPU上算,否则传输到GPU上的时间开销很大。
硬件需求。
你需要有NVIDIA GeForce FX 或者 ATI RADEON 9500 以上的显卡, 一些老的显卡可能不支持我们所需要的功能(主要是单精度浮点数据的存取及运算) 。
软件需求
首先,你需要一个C/C++编译器。你有很多可以选择,如:Visual Studio .NET 2003, Eclipse 3.1 plus CDT/MinGW, the Intel C++ Compiler 9.0 及 GCC 3.4+等等。然后更新你的显卡驱动让它可以支持一些最新特性。
本文所附带的源代码,用到了两个扩展库,GLUT 和 GLEW 。对于windows系统,GLUT可以在 这里下载到,而Linux 的freeglut和freeglut-devel大多的版本都集成了。GLEW可以在SourceForge 上下载到,对于着色语言,大家可以选择GLSL或者CG,GLSL在你安装驱动的时候便一起装好了。如果你想用CG,那就得下载Cg Toolkit 。
二者择其一
大家如果要找DirectX版本的例子的话,请看一下Jens Krügers的《 Implicit Water Surface》 demo(该例子好像也有OpenGL 版本的)。当然,这只是一个获得高度评价的示例源代码,而不是教程的。
有一些从图形着色编程完全抽象出来的GPU的元程序语言,把底层着色语言作了封装,让你不用学习着色语言,便能使用显卡的高级特性,其中BrookGPU 和Sh 就是比较出名的两个项目。
Back to top
初始化OpenGL
GLUT
GLUT(OpenGLUtility Toolkit)该开发包主要是提供了一组窗口函数,可以用来处理窗口事件,生成简单的菜单。我们使用它可以用尽可能少的代码来快速生成一个OpenGL 开发环境,另外呢,该开发包具有很好的平***立性,可以在当前所有主流的操作系统上运行 (MS-Windows or Xfree/Xorg on Linux / Unix and Mac)。
[cpp] view plaincopy// include the GLUT header file
#include 《GL/glut.h》
// call this and pass the command line arguments from main()
void initGLUT(int argc, char **argv) {
glutInit ( &argc, argv );
glutCreateWindow(“SAXPY TESTS”);
}
评论
查看更多