什么是GPU,GPU是怎么发展起来的,GPU和CPU的区别是什么,GPU是如何渲染图像的,又是如何从图像渲染做到做HPC(高性能计算)的,为什么GPU能做HPC?主流的GPU技术有哪些?NVIDIA的GPU是如何构成的。
一. 什么是GPU
GPU
GPU全称是Graphics Processing Unit,图形处理单元。它的功能最初与名字一致,是专门用于绘制图像和处理图元数据的特定芯片,后来渐渐加入了其它很多功能。
我们日常讨论GPU和显卡时,经常混为一谈,严格来说是有所区别的。GPU是显卡(Video card、Display card、Graphics card)最核心的部件,但除了GPU,显卡还有扇热器、通讯元件、与主板和显示器连接的各类插槽。
GPGPU
在GPU设计之初,并非针对深度学习,而是图形加速,在NVIDIA推出CUDA架构之前,GPU并无太强对深度学习运算能力的支持。真正用来作为人工智能算力支持的GPU,不是普通的显卡,而是GPGPU(General-Purpose Computing on Graphics Processing Units) 即通用计算图形处理器, 这是一种用于处理非特定需求(通用类型)计算目的的算力单元(芯片) 。通常,它们也被简称为通用GPU,也就是GPGPU。
二. GPU发展简史
1999年,NVIDIA公司在发布其标志性产品GeForce256时,首次提出了GPU的概念
从 VGA 卡 到 GPU 处理器
- 第一代显卡:支持 256 色显示的 VGA Card,1987年由IBM推出,是当时PC图形标准的代表,支持最多256种颜色的显示和640x480分辨率。这个标准让图形显示技术有了一个统一的平台,但所有的图形运算仍然依赖CPU。
- 第二代显卡:图形加速卡(Graphics Card),支持 Windows 图形加速,1991年,通过一颗专用的芯片来处理图形运算,从而将 CPU 部分解放了出来,让Windows界面运行起来非常流畅,从此图形化操作系统资源消耗大降、实用性大增。为了与单纯具备显示功能的 VGA Card 相区别,具备图形处理能的显卡被称为Graphics Card,也就是图形加速卡,它加速了Windows的普及,让PC走进了图形化界面时代。
- 第三代显卡:Video Card,支持视频加速,1994年,随着多媒体内容的增加,Video Card出现,它们不仅支持2D图形加速,还有视频播放加速功能,大大改善了PC上视频内容的播放质量。为了与单纯具备图形加速能力的 Graphics Card 相区别,具备视频辅助解码的显卡被称为 Video Card,也就是视频加速卡。
- 第四代显卡:3D Accelerator Card,也是在1994年,随着3D游戏的兴起,市场对3D图形处理的需求激增。NVIDIA公司通过其Riva TNT和TNT2显卡赢得了市场,这些卡通过增强的3D图形处理功能,如纹理映射和双线性过滤,提供了更加真实的游戏体验。
- 第五代显卡:GPU的诞生,1999年NVIDIA发布GeForce 256,宣布了GPU时代的到来。显示芯片上升到了与CPU同样的高度。GeForce 256是被作为一个图形处理单元(GPU)来设计的,GPU是一个单芯片处理器。它有完整的转换、光照、三角形设置和渲染引擎(分别为:Transform、Lighting、Setup、Rendering)等四种3D处理引擎,一些以前必须由CPU来完成的图形运算工作现在可以由GeForce256 GPU芯片独立完成,大多数情况下具有完整的传输和光照相引擎的GPU运算速度比CPU快2-4倍,同时也有效地减轻了CPU的浮点运算负担,减少了对CPU的依赖性。
- 现代显卡:21世纪的GPU已经成为一种高度复杂的并行处理器,不仅能够处理复杂的图形任务,还能执行科学计算和机器学习等计算密集任务。现代GPU支持DirectX 12和Vulkan等先进的图形API,以及CUDA、OpenCL和Tensor Core等通用计算技术。
发展里程碑
- 1980 年以前的图形硬件都只具备固定的图形功能,其中多数只支持帧缓冲的功能,因此属于图形加速器范畴,还不能称为 GPU。
- 1985 年开始,ATI、S3、3DFX、ViewLogic、Matrox、NVIDIA、Imagination、Rendition 等专业图形加速硬件公司如雨后春笋般出现,普遍把目标定位于消费级市场。早期产品大多定位于 2D 显示加速卡.
- 1992 年OpenGL(Open Graphics Library)发布, 它是一个跨平台的图形API,它被广泛用于计算机图形的渲染,尤其是在游戏开发和专业图形应用程序中。OpenGL由Silicon Graphics Inc.(SGI)在1992年首次发布。它为开发者提供了一套丰富的接口,用于绘制复杂的二维和三维图形。与此同时,OpenGL是开放标准,由非盈利组织Khronos Group进行维护和更新。OpenGL的设计允许高效、高性能的图形渲染,并且与程序员使用的各种编程语言兼容。它支持广泛的图形硬件,从简单的固定管线GPU到最先进的可编程渲染管线。随着计算机图形技术的发展,OpenGL也不断更新,引入了更多的功能和改进,以支持最新的图形渲染技术。OpenGL与NVIDIA的CUDA和统一着色器架构等技术一起,构成了现代图形和计算处理的重要基础。CUDA专注于利用GPU进行计算处理,而OpenGL则主要关注图形渲染。这两种技术的结合使得开发者能够更有效地实现高性能的图形和计算应用。
- 1996 年 3DFX 公司推出 Voodoo 图形芯片组,标志着 3D 图形加速卡市场正式出现。Voodoo 图形芯片组实现了图形流水线中从光栅化到帧缓冲的功能,顶点处理仍由 CPU 完成并经由 PCI 总线传输给 GPU, 此后GPU 的发展就是在此技术上沿着图形流水线继续增加功能。Voodoo 图形芯片组取得了巨大成功,几乎在一夜之间彻底革新了个人计算机中的图形处理器,超越了大量的仅能提供2D图形设计的供应商,开创了3D游戏时代,一度占据 80% 以上的相关市场,是真正意义上的第一款消费级3D显卡
- 1999 年,NVIDIA 公司设计了 GeForce 256 图形处理器,正式定义了 GPU 这个名词。
- 2000 年12月15日,Nvidia低价收购3Dfx图形处理相关所有产业。
- 2002-2004 年 ATI凭借Radeon 9700和微软Xbox的装机订单, 市场份额最高达到55%,而NVIDIA市场份额跌破50%,为NVIDIA迄今为止最低点。
- 2006 年,AMD为弥补独立芯片组的欠缺,以54亿美元收购ATI,GPU 市场由百家齐鸣变为 NVIDIA 公司和 AMD 公司的双雄争霸。
- 2006 年,NVIDIA 引入统一着色器架构(Unified Shader Architecture)是一个重要的技术进步,它允许显卡中的着色器处理器灵活地处理不同类型的着色任务,包括顶点着色、像素着色和几何着色。在此之前,显卡的着色器是分开的,即有专门的顶点着色器和像素着色器。统一着色器架构的推出使得GPU的处理能力得到了更高效的利用,从而显著提升了图形处理性能和灵活性。这一架构的引入,标志着NVIDIA在图形处理技术方面的一大步进,同时也推动了整个行业的发展。GPU从此进入通用计算时代。
- 2007 年,NVIDIA正式发布CUDA(Compute Unified Device Architecture 计算统一设备体系结构),CUDA是一个由NVIDIA开发的并行计算平台和应用程序接口(API),它允许软件开发者和软件工程师使用NVIDIA的图形处理单元(GPU)进行复杂的科学计算。CUDA技术使得开发者能够利用NVIDIA GPU的强大计算能力来加速计算密集型应用,比如物理模拟、计算生物学、图像处理和深度学习等。这种技术从根本上改变了计算领域,为高性能计算(HPC)提供了新的可能性,并在科学研究和工业应用中得到了广泛的应用。
- 2008 年,苹果,AMD,IBM推出了OpenCL(开放运算语言, 定义了适用于CPU, GPU等多种异构并行计算系统的架构框架和编程原则)开源标准,从此GPGPU时代正式开启
现代 GPGPU 产品
作为目前世界上最大的两家图形芯片提供商,美国的 NVIDIA 和 AMD公司在桌面及工作站 GPU 和 GPGPU 领域遥遥领先。除此之外,Intel 公司一直以来主要发展其集成显卡业务,而 ARM、高通等知名企业都在嵌入式 GPU 领域迅速发展。
NVIDIA GPGPU
NVIDIA 的 GPU 产品主要有 GeForce、Tesla和 Quadro 三大系列。三者采用同样的架构设计,也支持用作通用计算,但面向的目标市场及产品定位不同。其中,Quadro 的定位是专业用途显卡,GeForce 的定位是家庭娱乐,而 Tesla 的定位是专业的 GPGPU,因此没有显示输出接口,专注数据计算而不是图形显示。NVIDIA Tesla 系列经历了 Tesla(2008)、Fermi(2010)、Kepler(2012)、Maxwell(2014)Pascal(2016)、Volta(2017)、Turing(2018)和 Ampere(2020)这几代架构,每代架构更新都带来了产品工艺、计算能力、存储带宽等方面的巨大提升。
AMD GPGPU
在很长一段时间内,AMD 的 GPGPU 一直沿用超长指令字(Very Long InstructionWord,VLIW)架构。但由于超长指令字在通用计算领域发挥受限,AMD 于 2011 年推出了采用 GCN(Graphics Core Next)架构的 GPGPU 产品。
Intel GPGPU
相比于 NVIDIA 和 AMD独立显卡产品的不断迭代,Intel 的 GPU 更多情况下作为集成在北桥或 CPU内部的一块图形协处理器而存在。相比于独立显卡,集成显卡或核心显卡的形式会受限于面积、功耗和散热等问题,影响到图形处理和通用计算的性能。例如,Intel 在推出 HD Graphics 以前的显示核心包括 Intel Extreme Graphics 和 Intel GMA(Graphics Media Accelerator),都集成于北桥芯片中。随着 2010 年推出的 Nehalem 微架构逐步推行单芯片组设计,原来集成于北桥的显示核心移至 CPU 处理器上,称为 Intel HDGraphics 或“核心显卡”
在独立 GPU 方面,遭遇了 Larrabie 的挫折后,2020 年 Intel 以 10nm 制程重新设计了新一代 Xe 架构的 GPU,试图推动 GPU 算力从万亿次(TFLOPS)向千万亿次(PFLOPS)迈进。Intel 也将 Xe GPU 从 CPU 中分离成为 Iris Xe Graphics 独立显卡。它拥有 96 个流处理器,配备 4GB的 LPDDR4X显存,拥有128比特位宽。除传统的图形处理能力外,Iris Xe通过 OpenCl, 提供了通用计算能力。Xe GPU 家族由一系列显卡芯片组成,通过一个架构统一所有应用场景,如 Xe LP 低功耗、Xe HP 高性能、Xe HPC 数据中心。
三. CPU与GPU的区别
GPU与CPU体系结构对比
在面对并行任务处理时,CPU与GPU的体系结构在设计理念上有着根本的区别。
设计理念不同
- CPU 注重通用性来处理各种不同的数据类型,同时支持复杂的控制指令,比如条件转移、分支、循环、逻辑判断及子程序调用等,因此 CPU 微架构的复杂性高,是面向指令执行的高效率而设计的。
- GPU最初是针对图形处理领域而设计的。图形运算的特点是大量同类型数据的密集运算,因此 GPU 微架构是面向这种特点的计算而设计的。
图3-1
由于CPU一般处理的是低延迟任务,所以需要大量如图 3-1所示的一级(L1)、二级(L2)、三级(L3)高速缓存(cache)空间来减少访问指令和数据时产生的延迟。GPU的控制则相对简单,对高速缓存的需求相对较小,所以大部分晶体管可以组成各类专用电路、多条流水线,使得GPU的计算能力有了突破性的飞跃。图形渲染的高度并行性,使得GPU可以通过简单增加并行处理单元和存储器控制单元的方式提高处理能力和存储器带宽。
应用场景不同
CPU 与 GPU 二者的设计目的并不一样,因而适用的场景也截然不同。CPU 更擅长一次处理一项任务,而 GPU 则可以同时处理多项任务。 例如数组加法问题很适合演示 GPU 并行化。考虑以下数组:
-
- 数组 A = [1,2,3,4,5,6]
- 数组 B = [7,8,9,10,11,12]
- 我们需要计算每个元素之和,并存储在数组C中。
- 即 C = [1+7,2+8,3+9,4+10,5+11,6+12] = [8,10,12,14,16,18]
如果由 CPU 来执行整个操作,则代码如图3-2-1,前一个循环遍历数组的每个元素,并依次执行加法。当需要处理大量数字时,这种方法就会由于其顺序执行的性质而变得缓慢。为了克服这个限制,GPU 提供了一种解决方案:并行化加法运算。不同于依次执行运算的 CPU,GPU 可以同时执行多项加法。例如,运算 1+7、2+8、3+9、4+10、5+11 和 6+12 可以借助 GPU 并行化同时执行。 利用 CUDA,实现并行加法的代码如图3-2-2
图3-2-1 CPU运行数组加法
图3-2-2 CUDA运行数组加法
应用场景和架构上的差异还导致多核处理器与众核处理器在浮点计算性能上的差别。图3-3描述了2006-2020年具有代表性的部分英特尔(Intel)的CPU、英伟达(NVIDIA)的GPU和AMD(AMD)的GPU在性能上的对比和发展趋势,纵坐标是单精度的峰值浮点性能(GFLOPS)。可以看出,GPU的浮点性能都远高于中央处理器(CPU)。近年来,中央处理器大幅提升了其峰值浮点性能,但仍旧与具有强大浮点运算能力的中央处理器存在差距。
图 3-3 CPU与GPU峰值浮点型性能对比
GPU 的算力峰值通常由以下几个因素决定:
- CUDA 核心数量:每个 CUDA 核心可以执行一个线程,GPU 的算力峰值与 CUDA 核心数量成正比。
- 核心频率:GPU 的核心频率越高,每个核心每秒钟能够执行的指令数就越多。
- 每个核心的计算能力:不同型号的 GPU 具有不同的计算能力,通常以每个核心每个时钟周期能够执行的浮点指令数(FLOPS)为单位进行衡量。
- 并行度:GPU 的并行度决定了其能够同时执行的线程数量,从而影响了算力峰值。
四. GPU与图形渲染
GPU早期一般为了3D渲染而设计。从计算机图形学的角度,GPU将三维事件的点阵通过矩阵变化投影到二维平面上,这个过程叫做光栅化,最终在显示器上结果。GPU的能力基本上是顶点处理、光栅化、像素处理等,这个过程包含大量的矩阵计算,刚好利用了GPU的并行性。
图4-1 图形流水线或称渲染管线
图形流水线(渲染管线)
上帝视角看GPU(1):图形流水线基础_哔哩哔哩_bilibili
计算机在渲染的时候,把渲染任务分成了一系列的特定子阶段,这些阶段按照一定的顺序来处理顶点数据,最后生成图像,这些子阶段就构成了图形流水线。而整个图形流水线是由CPU和GPU共同来完成的。OpenGL 和 Direct3D 都定义了图形流水线(graphics pipeline)概念,包括一系列计算机图形显示过程中必须执行或可选的图形操作。目前,所有 GPU 的操作都是围绕图形流水线设计的。因此,接下来将分析图形流水线的主要操作,从中了解图形应用对 GPU 硬件体系结构提出了怎样的要求。当前的图形流水线非常复杂,下面以只包含基本操作的简化图形流水线来说明。
从概念上渲染流程分成3个阶段:应用程序阶段、几何阶段、光栅化阶段。其中每个阶段又包含多个子流水线阶段。
图4-2
应用程序阶段 :得到图元
应用程序阶段是由应用开发者来控制,通常都是在CPU上实现的。在该阶段需要应用开发者通过CPU来访问GPU,其调用过程如下:
图4-3
图4-4
几何阶段 :处理图元
由于几何阶段和光栅化阶段实现的载体是GPU,应用开发者无法完全控制这两个阶段的细节。但是GPU向开发者开放了很多控制权。这两个阶段都可以分成若干更小的流水线阶段,GPU为每个流水线阶段提供了不同的可配置性或可编程性。可以这么理解:GPU流水线中几何阶段和光栅化阶段都包含若干固定的子流水线阶段,这些流水线阶段的实现有些是完全由GPU固定死的,我们称之为不可控;有些提供了参数供开发者修改,这称之为可配置;有些则是完全由开发者通过着色器语言定义的函数来实现的,这称之为可编程。
图元:在图形渲染领域,图元(Primitives)是构成三维物体的最基本的几何单元。在图形流水线中,图元是通过图形API(如OpenGL、DirectX等)定义并提交到GPU进行处理的基本数据结构。图元通常包括点(Points)、线(Lines)和三角形(Triangles),这些都是用来构建更复杂三维模型的基础。因为三角形是唯一能保证在三维空间中稳定的基本形状。大多数三维图形和模型都是通过连接许多三角形来构建的。
片元:又称片段,在图形管线中,当图元(如三角形)通过光栅化阶段后,它们被分解成多个小的单元,这些单元覆盖了图元覆盖的屏幕区域的具体像素点。每个这样的单元被称为一个片元或片段。它们包含了用于最终像素显示的所有必要信息,如颜色、深度、纹理坐标等。
纹理(Texture): 纹理是一种用于表达物体表面外观的图像或图案。这些图像通常包含颜色信息,可以包括物体表面的细节、图案、颜色等。纹理可以被映射(贴图)到模型的表面,以模拟物体表面的外观。在三维图形中,纹理映射是通过将纹理坐标映射到模型表面的过程来实现的。纹理可以包含颜色信息、法线信息、高度信息等,用于模拟各种物体表面的细节。
着色器(Shader):这个术语来源于其在3D图形渲染中的核心作用,即决定图像的各个部分如何“着色”。这里的“着色”并不仅仅指颜色的填充,而是涵盖了从颜色计算、光照效果、纹理映射到视觉效果等多个方面的处理。着色器是用于定义这些视觉效果的程序或代码集,它们在图形渲染管线的特定阶段运行,对渲染出的图像的外观和感觉产生直接影响。
进入这个阶段之后,以及之后的阶段,就都主要由 GPU 负责了。几何阶段是在GPU中进行的,几何阶段负责对渲染图元进行逐顶点、逐图元处理。这一过程的主要任务是将顶点坐标变换到裁剪空间中,然后交给下个阶段进行光栅化处理。这个阶段对几何顶点数据处理后会输出其屏幕空间坐标、对应的深度值,还可能有其他额外信息如UV纹理坐标、法线方向、观察方向等。
图4-5
图4-5-1
-
-
顶点着色器(Vertex Shader) [可编程]:
- 对每个顶点进行处理,如变换(Transform)、光照(Lighting)等。
- 将顶点坐标从模型空间(Model Space)转换到世界空间(World Space),再到视图空间(View Space)。
-
曲面细分着色器(Tessellation Shader) [可编程][可选]:
- 根据需要细分几何体,提高模型的细节。
-
几何着色器(Geometry Shader) [可编程][可选]:
- 接收顶点着色器处理后的顶点,可以生成新的图元或者改变现有图元的形状。简单来说就是基于通过三角形、线段和点构建更复杂的几何图形。
-
裁剪(Clipping) [可配置]:
- 将顶点坐标转换到裁剪空间(Clip Space),并裁剪掉视锥体(View Frustum)外的顶点。裁剪的主要作用是提高渲染效率和性能。通过裁剪,渲染引擎可以忽略那些位于视锥体外的图元,即那些用户在当前视角下无法看到的物体。这样可以减少渲染处理的负担,因为引擎只需要处理和渲染视锥体内的图元。
-
屏幕映射(Screen Mapping) [不可控]:
- 最后,将裁剪空间的坐标映射到屏幕空间(Screen Space),为光栅化阶段做准备(确保图像正确地显示在屏幕上,按照用户的视角和屏幕尺寸调整)。
-
图4-5-2 曲面细分
图4-5-3 几何着色器
图4-5-4 视锥体剪裁
光栅化阶段
光栅化的主要目的是将几何渲染之后的图元信息,转换为一系列的像素,以便后续显示在屏幕上。这个阶段中会根据图元信息,计算出每个图元所覆盖的像素信息等,从而将像素划分成不同的部分。一种简单的划分就是根据中心点,如果像素的中心点在图元内部,那么这个像素就属于这个图元。如图4-6所示,深蓝色的线就是图元信息所构建出的三角形;而通过是否覆盖中心点,可以遍历出所有属于该图元的所有像素,即浅蓝色部分。
图4-6
图4-6-1 光栅化
图4-6-2 ROP
-
-
三角形设置(Triangle Setup) [不可控] :
- 这是光栅化的第一个阶段,光栅化阶段的主要目标是:计算每个图元覆盖了哪些像素,并准备这些像素的基本属性(如颜色和深度)。
- 三角形设置阶段的输入是上一阶段输出的顶点屏幕坐标、深度值(z坐标)和其他相关的额外信息如法线方向、视角方向等。
- 具体来讲,这一阶段的输入是三角网格的三个顶点,这些顶点的信息是由上一阶段输出的。要得到整个三角形对屏幕上像素的覆盖情况,就需要计算每条边和边界像素的信息,也就是说这一阶段我们需要以一种方式来表示这个三角形。暴力点理解就是:需要构造一个三角形类的实例。
-
三角形遍历(Triangle Traversal) [不可控] :
- 这一阶段的主要任务是扫描每个像素,根据上一阶段得到的三角形边界信息,决定其是否被当前图元(这里就是三角形)所覆盖。
- 对覆盖的每个像素生成一个片元,这些片元的顶点信息(屏幕坐标、深度z,法线方向等所有信息)将通过对三角网格的三个顶点进行插值得到。
- 这一阶段的输出是片元序列。注意,片元对应像素,但片元不是像素,它包含了很多顶点信息和状态用以计算对应像素的颜色。
-
片元着色器(Fragment Shader) [可编程] :
- 在Direct3D中片元着色器被称为像素着色器。在Unity Shader中必须自定义片元着色器。
- 这一阶段的输入是上一阶段的片元序列。输出是对应这些片元的一个或者多个颜色值。
- 这一阶段会遍历上一阶段的片元序列并对每个片元执行片元着色器。
- 在这个阶段最重要的技术就是进行纹理采样。片元着色器仅影响单个片元。
-
逐片元操作 (Per-Fragment Operations) [可配置]:
- 这一阶段在Direct3D中称为合并/混合阶段 也称ROP。已经很明确了这一阶段的的操作单位是片元,目的是将上一阶段输出的片元颜色与颜色缓冲区中的颜色进行混合。
- 这一阶段的处理过程如下:
-
-
-
-
- 检测片元的可见性:检测包括对片元进行模板测试和深度测试
- 将通过检测的片元与颜色缓冲区中的颜色按照指定的方式进行混合;将未通过检测的片元舍弃掉,这也意味着之前的所有计算和检测都白费了。
- 将最终颜色写入帧缓冲区(Frame Buffer),随后显示到屏幕上 。
-
-
总结
上述GPU 所负责的渲染流水线,可以通过这一个简单的三角形被渲染的过程来理解,同时也可以看到即使是一个简单的三角形绘制就需要大量的计算,例如,在1080P分辨率下,一副静态图像的渲染需要大约207万像素,每个像素都需要被计算和渲染。如果再有更多更复杂的顶点、颜色、纹理信息(包括 3D 纹理),那么计算量是难以想象的。这也是为什么 GPU 更适合于渲染流程。
图4-7
图4-8
阶段名称 | 作用 | 说明 |
---|---|---|
顶点处理 (Vertex Processing) | 处理每一个顶点的位置和属性。 | 确定每个角的位置和其特征,如颜色。 |
图元装配 (Primitive Assembly) | 将处理过的顶点组合成基本图形单元,如三角形。 | 将角连接起来,形成一个个小的平面(如三角形)。 |
光栅化 (Rasterization) | 将三角形等图元转换为像素网格,为每个像素确定颜色和其他属性。 | 将小平面放到屏幕上,决定哪些像素属于哪个三角形,并为其上色。 |
片段处理 (Fragment Processing) | 计算每个像素的最终颜色,可能包括纹理、光照和阴影等效果。 | 给每个小方块(像素)涂上详细的颜色和纹理,如加上光影效果,使图像看起来更真实。 |
深度和模板测试 (Depth and Stencil Testing) | 确定哪些像素实际上应该显示在其他像素前面。 | 确定哪些部分应该在前面显示,如人应该显示在树的前面。 |
混合 (Blending) | 将多个像素的颜色值合成一个最终的颜色,常用于处理透明度。 | 比如一个玻璃窗前有一棵树,玻璃窗透明,应适当显示玻璃和树的颜色。 |
输出合成 (Output Merging) | 将所有计算和测试的结果合并,输出到屏幕上的最终图像。 | 将所有处理过的像素合成最终的图像,展现在你的电脑或电视屏幕上。 |
图形API
图像编程接口,是对 GPU 硬件的抽象,其地位类似 C 语言,属于 GPU 编程的中低层,主要做的事情是提供统一的接口来调用显卡驱动。显卡驱动的地位类似于 C 语言编译器,可以将 OpenGL 或 DirectX 的函数调用翻译成 GPU 能读取的机器指令,即二进制文件。显卡驱动同时也负责把纹理等数据转换成 GPU 支持的格式。
图3-8就是一个Linux服务器下的图形架构示例。
图形API | 维护组织 | 适用平台 | 支持的显卡厂商 |
---|---|---|---|
OpenGL | Khronos(柯罗诺斯) Group | 跨平台 | 大部分现代GPU(包括NVIDIA, AMD, Intel等) |
Direct3D | Microsoft | Windows | 主要是NVIDIA和AMD的GPU |
Vulkan(昵称“火山”或者“福尔康”) | Khronos(柯罗诺斯) Group | 跨平台 | 大部分现代GPU(包括NVIDIA, AMD, Intel等) |
Metal | Apple | macOS, iOS, tvOS | Apple的GPU |
WebGL | Khronos Group | Web浏览器 | 大部分现代GPU(包括NVIDIA, AMD, Intel等) |
OpenGL
OpenGL(Open Graphics Library)是一个跨平台的图形API,由非盈利组织Khronos Group维护。它首次发布于1992年,主要用于二维和三维图形的渲染。OpenGL是开放标准,支持广泛的操作系统和设备,包括Windows、Linux、Mac OS等。它的主要优势在于其广泛的兼容性和跨平台特性,使得它在科学可视化、CAD和某些游戏开发中非常受欢迎。
DirectX
DirectX是由微软开发的一套API,专门用于Windows平台,首次推出于1995年。DirectX包括多个不同的API,如Direct3D(用于3D图形渲染)、DirectSound(用于音频)、DirectInput(用于游戏控制器输入)等。Direct3D是DirectX中最为知名的部分,它是与OpenGL直接竞争的图形API。DirectX的主要优势在于其高性能和与Windows操作系统的深度集成,使其成为大多数PC游戏和高端图形应用的首选。
Vulkan
Vulkan也是由Khronos Group开发的现代图形和计算API,旨在提供更高的性能和更低的CPU使用率。它于2016年发布,被视为OpenGL的继任者。Vulkan提供了比OpenGL更低级的控制,允许开发者更好地优化其应用以适应多种硬件设备。Vulkan支持跨平台使用,包括Windows、Linux、Android等,并且由于其高效的性能管理,被广泛应用于游戏开发、高性能计算和实时图形应用中。
Metal
Metal 是由苹果公司开发的一种先进的图形和计算接口,专为iOS、macOS、tvOS和watchOS等苹果操作系统上的设备优化。它于2014年首次推出,目标是提供比传统图形API(如OpenGL)更低层次的硬件访问权限,从而允许开发者和应用程序能够更高效地利用设备上的GPU资源。
WebGL
WebGL(Web Graphics Library)是一个JavaScript API,用于在不需要插件的情况下,在任何兼容的网页浏览器中渲染2D和3D图形。它基于OpenGL ES,一个为嵌入式系统(如移动电话、个人数字助理等)设计的图形API的子集。通过利用WebGL,开发者可以在网页中直接利用GPU的能力,创建复杂的视觉效果和详细的图形场景,从而提供更加丰富和互动的网页体验。由非盈利组织Khronos Group维护。
图4-8