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显得有点烦琐。

赞(1)
未经允许不得转载:极客笔记 » OpenCL 与OpenGL

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
OpenCL 基本概念
OpenCL 是什么OpenCL 平台模型OpenCL 执行模型OpenCL 上下文简介OpenCL 命令队列简介OpenCL 在设备上执行内核OpenCL 存储器区域OpenCL 存储器对象OpenCL 共享虚拟存储器OpenCL 与OpenGL
OpenCL 基础教程
OpenCL 在Windows上搭建开发环境OpenCL 在Linux上搭建开发环境OpenCL 在OS X上搭建开发环境OpenCL 第一个程序OpenCL 平台OpenCL 设备OpenCL 创建上下文OpenCL 创建命令队列OpenCL 创建Program对象OpenCL 编译Program对象OpenCL 查询和管理Program对象OpenCL 创建内核对象OpenCL 设置内核参数OpenCL 查询和管理内核对象OpenCL 执行内核OpenCL 编写内核代码OpenCL 错误处理
OpenCL C特性
OpenCL 地址空间修饰符OpenCL 函数修饰符OpenCL 对象访问修饰符OpenCL 标量数据类型OpenCL 为什么要有矢量数据类型OpenCL 矢量初始化OpenCL 读取和修改矢量分量OpenCL 运算符OpenCL 维度和工作项OpenCL 工作组OpenCL 矢量数据拷贝OpenCL 异步拷贝和预取OpenCL 数学函数OpenCL 公共函数OpenCL 几何函数OpenCL 整数函数OpenCL 关系函数OpenCL 杂项矢量函数OpenCL 同步函数OpenCL 原子函数OpenCL 内建图像读函数OpenCL 内建无采样器图像读函数OpenCL 内建图像写函数OpenCL 内建图像查询函数OpenCL 工作组函数OpenCL 内建管道读/写函数OpenCL 内建工作组管道读/写函数OpenCL 内建管道查询函数OpenCL 设备队列OpenCL Blocks语法OpenCL 设备队列相关函数OpenCL 子内核存储器可见性OpenCL 设备队列的使用示例
OpenCL 存储器对象
OpenCL 存储器对象OpenCL 分配缓冲区对象OpenCL 创建子缓冲区对象OpenCL 图像对象和采样器对象OpenCL 图像对象OpenCL 图像格式描述符OpenCL 图像描述符OpenCL 图像对象查询OpenCL 采样器对象OpenCL 主机端采样器对象OpenCL 设备端采样器对象OpenCL 图像旋转示例OpenCL 管道OpenCL 创建管道对象OpenCL 管道对象查询OpenCL 主机与设备间数据传输OpenCL 图像对象主机与设备间数据拷贝OpenCL 缓冲区对象数据填充OpenCL 图像对象数据填充OpenCL 缓冲区对象间数据传输OpenCL 图像对象和缓冲区对象间数据拷贝OpenCL 缓冲区对象映射OpenCL 图像对象映射OpenCL 解映射OpenCL 共享虚拟存储器OpenCL SVM缓冲创建与释放OpenCL SVM缓冲映射与解映射OpenCL SVM缓冲填充与拷贝OpenCL SVM类型OpenCL SVM特性OpenCL 共享虚拟存储器示例OpenCL 存储器一致性模型OpenCL 存储器次序规则OpenCL 原子操作的存储器次序规则OpenCL 栅栏操作的存储器次序规则OpenCL 工作组函数的存储器次序规则OpenCL 主机端与设备端命令的存储器次序规则OpenCL 关于存储器次序在实际OpenCL计算设备中的实现
OpenCL 同步及事件机制
OpenCL 同步及事件机制OpenCL 主机端的OpenCL同步OpenCL OpenCL事件机制OpenCL 对OpenCL事件的标记和栅栏OpenCL 内核程序中的同步OpenCL 工作组内同步OpenCL 原子操作OpenCL 1.2中的原子操作OpenCL 2.0中的原子操作OpenCL 局部存储器与全局存储器间的异步拷贝OpenCL 工作组间同步
OpenCL 与OpenGL互操作
OpenCL 与OpenGL互操作OpenCL 从一个OpenGL上下文来创建OpenCL上下文OpenCL 使用OpenGL共享的缓存对象OpenCL 使用OpenGL纹理数据OpenCL 共享OpenGL渲染缓存OpenCL 从一个OpenCL存储器对象查询OpenGL对象信息OpenCL 访问共享对象的OpenCL与OpenGL之间的同步OpenCL AMD Cayman架构GPUOpenCL AMD GCN架构的GPUOpenCL NVIDIA CUDA兼容的GPUOpenCL NVIDIA GPU架构的执行模型OpenCL NVIDIA GPU的全局存储器OpenCL NVIDIA GPU的局部存储器OpenCL ARM Mali GPU硬件架构OpenCL ARM Mali GPU存储器层次OpenCL ARM Mali GPU OpenCL映射