OpenCL 与OpenGL

从GPU诞生之日起,GPU的设计逻辑与CPU的设计逻辑相差很多。GPU从诞生之日起,它的定位是3D图形渲染设备。在设计GPU时从其功能出发,把更多的晶体管用于数据处理。这使得GPU相比CPU有更强的单精度浮点运算能力。人们为了充分利用GPU的性能,使用了很多方法。这其中不得不提OpenGL(Open Graphics Library,开放图形库)。

CPU与GPU架构区别

OpenGL定义了一个跨编程语言、跨平台的应用程序接口规范,它用于生成二维、三维图像。这个接口由近350个不同的函数调用组成,用来从简单的图像比特绘制到复杂的三维景象。

当我们把绘制的图像传递给OpenGL后,OpenGL还要做很多才能完成3D空间到屏幕的投影。这一系列的过程称为OpenGL渲染流水线。一般的渲染流水线过程如下图所示。在顶点装配和片段操作中,使用GPU中的着色器(英文为shader,实际上就是GPU的处理器)来进行相应操作。进行几何处理的处理器叫顶点着色器,它负责对顶点进行坐标转换、投影变换等;进行片段颜色处理的叫片段着色器。

随着GPU技术的发展,GPU的图形渲染流水线从固定功能流水线发展到可编程渲染流水线。可编程渲染流水线含有若干可编程着色器(比如,OpenGL 2.0起支持顶点和片段着色器;OpenGL 3.2起支持了几何着色器;OpenGL 4.0起支持了细分曲面相关的着色器;OpenGL 4.3又引入了计算着色器),这些可编程着色器处理单元可实现用户自定义算法的功能。OpenGL中的GLSL(OpenGL Shading Language,OpenGL着色器语言)就是一种着色器语言。利用GLSL可以实现上述GPGPU(General Purpose GPU,通用计算GPU)的各种着色器程序。但为了掌握GLSL,人们需要去学习太多的计算机图像学知识,这使得在开始时的学习曲线比较陡峭。

OpenGL图像流水线

从2007年以后,基于CUDA和OpenCL这些被设计成具有近似于高阶语言的语法特性的新GPGPU语言,降低了人们使用GPGPU的难度,平缓了开始时的学习曲线。使得在GPGPU领域,OpenGL中的GLSL逐渐退出了人们的视线。OpenCL与OpenGL一样,都是基于硬件API的编程。

OpenCL与CUDA

2007年,NVIDIA向市场推出GPGPU整套解决方案——CUDA。CUDA是集硬件与软件于一体的集成技术。CUDA C编程是在C99的扩展上进行的,这大大降低了开发GPGPU程序的难度,使得开发人员可以方便地开发GPGPU程序。对于CUDA C的代码,只能运行在NVIDIA G80架构以后的GPU上。

OpenCL是2008年才发布的基于硬件API编程的工业标准。OpenCL相比CUDA,支持的平台更多,除了GPU还有CPU、DSP、FPGA等设备。OpenCL已发布4个正式标准,最新版本为OpenCL 2.1,而NVIDIA的GPU只支持到OpenCL 1.2,对于开发人员来说有点遗憾。

OpenCL编程模型设计时,借鉴和参考了CUDA编程模型。从编程语言来看,OpenCL和CUDA语法基本类似,所以对开发人员而言,如果熟悉OpenCL或CUDA中的其中一种,要熟悉另外一种编程语言是很容易的,这也使CUDA与OpenCL程序之间相互移植会比较容易。不过由于OpenCL支持平台更多,所以在主机端OpenCL处理相比CUDA显得有点烦琐。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程