GPU通用计算API的变迁和趋势

原文链接

在高性能计算、机器学习等现代应用领域中,GPU(Graphics Processing Unit)是占统治地位的计算引擎。GPU从早期的固化逻辑实现、到可编程、到今天的通用计算架构(GPGPU),其应用接口(API)随着功能和通用性的提升而变得越来越灵活和高效。

1. 图形渲染:DirectX 和 OpenGL

早期的GPU有浑名显卡也不冤枉。从软件角度来说,其逻辑架构基本上就是图形的三角形坐标变换、顶点照明、像素着色等一系列功能。因为逻辑固化、功能单纯,应用程序通过驱动接口可以直接执行这些功能,主要API就是较早版本的OpenGL和DirectX。

OpenGL源于曾经非常风光的SGI公司,然后演进成支持跨平台图形的工业标准,版本也从最初的1.x,到2.0,3.x,到今天的4.5【1】。目前Khronos Group(OpenGL标准化组织)正在推进OpenGL5.0。而DirectX是微软的windows平台上专用API。DirectX图形API最初的几个版本基本上是奋力直追OpenGL的features,直到DirectX 9.3c,微软才完成了实质上的超越。DirectX 9.3在features上大致相当于OpenGL3.3。(注意,OpenGL分为台式、嵌入式两个不同的profile,其版本之间的一一对应关系不甚明显)

随着图形算法的改进和对高质清晰画面的追求,GPU需要越来越强大的灵活性来支持纹理、材料属性、和精细度渲染,固化的逻辑显然无法跟得上这些需求。GPU实现真正意义上的可编程是支持高层渲染语言(shading language)。对应于OpenGL的高层语言是GL Shading Language(简称GLSL),对应于DirectX的高层语言是High Level Shading Language (或HLSL)。GPU的可编程流水线架构如下:

由上图可见,在GPU的逻辑流水线上,只有两个阶段是可编程的,其它的仍然是固化的硬件支持。其中,一个可编程的stage是三角形顶点处理器(vertex processor),用户可以根据自己的需求编写适当的坐标变换、光线照明等复杂程序。另一个是像素处理器(fragment processor),实现更细节的渲染和纹理映射等。两个处理器对应的GPU程序分别叫做vertex shader 和fragment shader。在DirectX中,fragment shader叫做pixel shader。

不同的GPU厂商对上述的可编程逻辑单元有不同的的硬件实现。比如,英伟达(Nvidia)早期的GeForce 系列,ARM Mali GPU都采取了离散架构,即vertex processor和fragment processor是独立的物理处理单元。英伟达直到GeForce 8 系列的Tesla微架构,才改成了归一化的GPU架构【2】,即统一的处理器可以同时执行vertex shader 和fragment shader。ARM Mali Midgard和最近的Bifrost微架构也采用了归一化的实现【3】。不过,高通(Qualcomm)的Adreno GPU一开始就是归一化的微架构。

2. 通用计算:DirectX、OpenGL/OpenCL和Renderscript

在DirectX9.3 实现超越之后,微软在GPU API方面一直处于领跑地位。只是DirectX 10时运不济,几乎随着Windows Vista灰飞烟灭。但之后的DirectX 11改头换面,并率先推出了细分曲面(tessellation)和通用计算(compute)API,实现了从GPU 到GPGPU(general-purpose GPU)的飞跃【4】。

虽然从API的角度,通用计算处理器似乎是一个独立的单元,但一般的GPU物理实现都是重复利用流水线上的可编程单元(归一化的处理器),在执行通用计算GPU程序(叫做compute shader)时忽略其它的硬件功能。Vertex shader,fragment shader,和compute shader采用归一化的编程模型。

因为DirectX是微软的专用API,OpenGL社区也不甘落后,很快就推出相应的OpenGL通用计算和细分曲面功能。为了有别于DirectX,OpenGL的tessellation 程序叫做tessellation control shader和tessellation evaluation shader,分别对应于DirectX的Hull shader和Domain shader。OpenGL ES(嵌入式系统)在3.1版本引进了通用计算,但直到去年的3.2版本才正式加入tessellation功能(在此之前由Google的扩展包得以维系)。

真正跨平台的通用计算API是Khronos的OpenCL1.x 和随后的OpenCL2.x。感觉比较别扭的是,同一个Khronos Group标准化组织,却同时有两套通用计算API。简单的理解是,OpenCL是为大计算准备的(heavy-duty compute),比如在GPU上的大规模高性能科学计算。OpenGL compute是轻量级的,适合于简单的图形、图像处理等任务。例如,在模拟粒子系统时,用OpenGL通用计算API来计算速度、位置、势能等,再快速切换到渲染模式,把整个粒子系统显示出来。相比之下,OpenCL需要比较复杂的set-up,而且和图形渲染之间的相互切换(inter-op)也有较高的执行开销。

需要强调的是,OpenCL虽然是从GPU领域诞生出来,但通用计算框架远不止适用于GPU。同样可以应用在CPU,DSP,FPGA,或其它异构计算的体系架构中。OpenCL在跨平台的功能移植性(functional portability)方面是很好的,但是其性能移植性(performance portibility)往往并不理想。

另一个算是常用、但并不被大多数人知道的通用计算API是Google推出的RenderScript。Google一开始是希望能像DirectX一样,同时支持图形渲染和通用计算。但很快发现,图形渲染抵不过OpenGL,便丢下了渲染,专注于通用计算。所以有人开玩笑说,RenderScript既不是render也不是script。目前,RenderScript主要用在安卓系统中,只有Google自己的应用在使用。但随着下一代通用计算API的发展,RenderScript前途未卜。

3. 下一代API:一场“几乎零开销驱动”的竞争

阿里的许多业务app在手机端上执行,对GPU的使用一般都是轻量级的。但随着业务功能的增强,特别是AI和机器学习应用的普及,在端上的计算越来越多。之前的图形渲染、通用计算API,不管是OpenCL和OpenGL,还是Renderscript,驱动开销(driver overhead)都比较高。所以提高端上GPU功效、增加电池续航能力是移动GPU的当务之急。即使是在数据中心,能降低驱动程序的开销,提高服务器CPU/GPU效率,对能源、硬件资源的节省也可以带来可观的效益。所以近两三年来,工业界在研究如何降低GPU驱动上投入了大量的人力物力。几大巨头纷纷加入了所谓的“几乎零开销驱动”(almost zero overhead driver,AZOD)的竞争。

  • 苹果的Metal API,主要用在iOS和MacOS上
  • 微软的DirectX 12,当然还是聚集在windows系统中
  • 超微(AMD)推出了Mantle
  • Google 也有自己的版本(出于公司的秘密,隐去其名)
  • Khronos Group跨平台的Vulkan

经过一番混战和讨价还价,竞争的结果就是AMD和Google各自把自己的ideas和框架工作捐给了Khronos,融合、演变成了现在的Vulkan 1.0。笑到最后的是苹果Metal和微软DirectX 12专用API,以及Khronos Group的跨平台通用Vulkan API。实质上,这三个API的features都是大同小异。

当然,AZOD并不能魔术般的让驱动程序开销一扫而光。他们在实现层面上主要集中在以下几点:

  • 减少GPU在命令序列中的状态更新、同步等开销
  • 重复使用命令包,并允许增量更新(incremental update)
  • 实现多个渲染目标的融合,减少GPU数据的导入、导出
  • non-binding 纹理等资源的使用
  • 把内存管理、多线程管理等繁琐的任务推到用户层;用户本来就有更好的全局观来管理资源的生命周期
  • 把GPU程序(shaders)的编译工作在线下预处理,降低在线编译的开销

再稍微介绍一下Vulkan:
如果想理清Vulkan和OpenGL的关系,可以把Vulkan看成是下一代的OpenGL,即OpenGL 5.0。在Vulkan的命名上,除了希腊神话中的强大火神外,还有5的意思(罗马数字V)。同样,Vulkan也有一个附带的编程语言,叫做SPIR-V (standard portable intermediate representation,SPIR)。V既是5,也是针对Vulkan。不过,SPIR-V在语言的定义上,远超出了图形的范畴,有能力表述通用计算、甚至C++的功能。现在有不少开源项目是基于SPIR-V,以得到更好的移植性。

4. 后记

上文提到,Khronos Group工业标准有两套通用计算API,OpenCL和OpenGL(加上一个新的Vulkan)。这两套API到底是什么关系呢?正所谓,天下大势,分久必合。目前的解决思路主要有两个:

  • 淘汰OpenCL,把其功能和某些特性引入到Vulkan中
  • OpenCL作为上层API,用Vulkan在底层来实现OpenCL的功能

第二个想法与C++/C的关系有点像。C++可以作为与C无关的独立语言,但C++的功能往往可以用C来具体实现。虽然Khronos 标准组织还没有对外公开最后的答案,感觉这个方案可能会通过。

旁白

本文有意回避了把CUDA作为通用计算API的讨论。严格意义上讲,CUDA是一个GPU的软件生态系统,且只限于英伟达的GPU架构。所以和DirectX或RenderScript还是有区别的。

参考文献

  1. https://www.khronos.org/opengl/wiki/History_of_OpenGL
  2. https://en.wikipedia.org/wiki/List_of_Nvidia_graphics_processing_units
  3. The Bifrost GPU architecture and the ARM Mali-G71 GPU
  4. https://en.wikipedia.org/wiki/DirectX

原文链接

时间: 2024-10-08 09:57:47

GPU通用计算API的变迁和趋势的相关文章

五大移动GPU厂商

<谁能笑傲江湖?移动处理器门派那些事儿>一文中我们把2012年的移动处理器的厂商做了一番介绍,并按照各自的属性给划分了门派.既然把他们称为江湖门派,那么每一个门派总要有自己的绝活.移动处理器厂商中CPU基本都是源自ARM,同架构下各家厂商的表现都差不多,能成为镇派之宝的绝学都是在GPU上.超能网近日奉上续作,对五大移动GPU厂商进行了逐一点评-- 做能移动处理器的厂商可以洋洋洒洒列出几十家,我们精挑细选了近年出过风头的依然有13家,但是说到设计GPU核心,这个名单就短多了,主要的厂商甚至不到5

CPU+GPU异构计算编程简介

分享一下我老师大神的人工智能教程吧.零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!http://www.captainbed.net 异构计算(CPU + GPU)编程简介 1. 概念 所谓异构计算,是指CPU+ GPU或者CPU+ 其它设备(如FPGA等)协同计算.一般我们的程序,是在CPU上计算.但是,当大量的数据需要计算时,CPU显得力不从心.那么,是否可以找寻其它的方法来解决计算速度呢?那就是异构计算.例如可利用CPU(Central Processing

GPU抗锯齿

抗锯齿(Anti-aliasing):标准翻译为"抗图像折叠失真".由于在3D图像中,受分辨的制约,物体边缘总会或多或少的呈现三角形的锯齿,而抗锯齿就是指对图像边缘进行柔化处理,使图像边缘看起来更平滑,更接近实物的物体.它是提高画质以使之柔和的一种方法.如今最新的全屏抗锯齿(FullSceneAnti-Aliasing)可以有效的消除多边形结合处(特别是较小的多边形间组合中)的错位现象,降低了图像的失真度.全景抗锯齿在进行处理时,须对图像附近的像素进行2-4次采样,以达到不同级别的抗锯

Vivante GPU简介

目录 1. IMX6Q中Vivante GPU简介    1 1.1    IMX6Q中GPU型号    1 1.2    Vivante GC2000硬件架构    1 2. Vivante GPU使用的图形API简介    2 2.1    OpenGL ES    2 2.2    EGL    2 2.3    Vivante GPU软件框架    3 IMX6Q中Vivante GPU简介 IMX6Q中GPU型号 在imx6q中有3个vivante的GPU,分别是GC2000.GC32

AutoCAD二次开发&mdash;&mdash;AutoCAD.NET API开发环境搭建

AutoCAD二次开发--AutoCAD.NET API开发环境搭建 AutoCAD二次开发--AutoCAD.NET API开发环境搭建 AutoCAD二次开发工具:1986年AutoLisp,1989年ADS,1990年DCL,1993年ADS-RX,1995年ObjectARX,1996年Active X Automation(COM),1997年VBA,1998年Visual Lisp,2006年.net API(DLL). 趋势和方向:AutoCAD.net API(AutoCAD20

玩深度学习选哪块英伟达 GPU?有性价比排名还不够!

本文來源地址:https://www.leiphone.com/news/201705/uo3MgYrFxgdyTRGR.html 与"传统" AI 算法相比,深度学习(DL)的计算性能要求,可以说完全在另一个量级上. 而 GPU 的选择,会在根本上决定你的深度学习体验.那么,对于一名 DL 开发者,应该怎么选择合适的 GPU 呢?这篇文章将深入讨论这个问题,聊聊有无必要入手英特尔协处理器 Xeon Phi,并将各主流显卡的性能.性价比制成一目了然的对比图,供大家参考. 先来谈谈选择

Javascript如何实现GPU加速?

一.什么是Javascript实现GPU加速? CPU与GPU设计目标不同,导致它们之间内部结构差异很大.CPU需要应对通用场景,内部结构非常复杂.而GPU往往面向数据类型统一,且相互无依赖的计算.所以,我们在Web上实现3D场景时,通常使用WebGL利用GPU运算(大量顶点).但是,如果只是通用的计算场景呢?比如处理图片中大量像素信息,我们有办法使用GPU资源吗?这正是本文要讲的,GPU通用计算,简称GPGPU. 二.实例演示:色块识别. 如下图所示,我们识别图片中彩虹糖色块,给糖果添加表情.

GPU大百科全书 前传 看图形与装修的关系

又是一年装修季 前言:大部分人都会觉得,把我们面前这些晶体管铺成的电路跟现实生活联系起来是非常荒谬的.比如说显卡吧,只要显卡没有坏掉的话,把它插在完整的主板系统上再通上电,接在上面的屏幕就会很自然的亮起来,显卡只是一个跑图形工具,跟锅碗瓢勺电灯泡洗衣机什么的没啥区别.生活就是生活,上班下班买菜做饭,该用工具的时候用就是了,工具的工作原理是建立在理论之上的,无论是晶体管和图形数学,或者构成菜刀的珠光体和铁素体颗粒,亦或是电灯泡内部的真空,这些都是原理的产物,跟生活一毛钱联系都没有. 其实即便是喜欢

体系结构课程报告

一.CUDA概念 CUDA,英文全名Compute Unified Device Architecture,中文名统一计算设备架构,是一种革命性的并行计算架构.它同时支持硬件和软件的技术,统一了 GPU 的通用计算编程模式,同时引入的共享存储器,提高计算速度.CUDA 不需要借助图形学 API,而是采用了类 C 语言进行开发.同时,CUDA 采用了统一处理架构,降低了编程的难度,这使得CUDA 架构更加适合进行 GPU 通用计算.这里所说的GPU,GPU (Graphic Processing