关于机器学习:为什么要专门出现GPU来处理图形工作

45次阅读

共计 6366 个字符,预计需要花费 16 分钟才能阅读完成。

GPU 英文名称为 Graphic Processing Unit,GPU 中文全称为计算机图形处理器,1999 年由 NVIDIA 公司提出。

一、GPU 概述

GPU 这一概念也是绝对于计算机系统中的 CPU 而言的,因为人们对图形的需要越来越大,尤其是在家用零碎和游戏发烧友,而传统的 CPU 不能满足现状,因而须要提供一个专门解决图形的外围处理器。

GPU 作为硬件显卡的“心脏”,位置等同于 CPU 在计算机系统中的作用。同时 GPU 也能够用来作为辨别 2D 硬件显卡和 3D 硬件显卡的重要依据。2D 硬件显卡次要通过应用 CPU 来解决个性和 3D 图像,将其称作“软减速”。

3D 硬件显卡则是把个性和 3D 图像的解决能力集中到硬件显卡中,也就是“硬件加速”。目前市场上风行的显卡多半是由 NVIDIA 及 ATI 这两家公司生产的。

1.1、为什么须要专门呈现 GPU 来解决图形工作,CPU 为啥不能够?

GPU 是并行编程模型,和 CPU 的串行编程模型齐全不同,导致很多 CPU 上优良的算法都无奈间接映射到 GPU 上,并且 GPU 的构造相当于共享存储式多解决构造,因而在 GPU 上设计的并行程序与 CPU 上的串行程序具备很大的差别。GPU 次要采纳立方环境的材质贴图、硬体 T &L、顶点混合、凹凸的映射贴图和纹理压缩、双重纹理四像素 256 位的渲染引擎等重要技术。

因为图形渲染工作具备高度的并行性,因而 GPU 能够仅仅通过减少并行处理单元和存储器管制单元便可无效的进步解决能力和存储器带宽。

GPU 设计目标和 CPU 截然不同,CPU 是设计用来解决通用工作,因而具备简单的管制单元,而 GPU 次要用来解决计算性强而逻辑性不强的计算工作,GPU 中可利用的处理单元能够更多的作为执行单元。因而,相较于 CPU,GPU 在具备大量反复数据集运算和频繁内存拜访等特点的利用场景中具备无可比拟的劣势。

1.2、GPU 如何应用?

应用 GPU 有两种形式,一种是开发的应用程序通过通用的图形库接口调用 GPU 设施,另一种是 GPU 本身提供 API 编程接口,应用程序通过 GPU 提供的 API 编程接口间接调用 GPU 设施。

1.2.1、通用图形库

通过通用的图形库的形式应用 GPU,都是通过 OpenGL 或 Direct3D 这一类现有的图形函数库,以编写渲染语言 (Shading Language) 的办法管制 GPU 外部的渲染器 (Shader) 来实现须要的计算。

目前业界公认的图形编程接口次要有 OpenGL 和 DirectX 这两种接口。OpenGL 是以后可用于开发可交互、可移植的 2D 与 3D 图形应用程序的首选环境,也是以后图形利用最宽泛的规范。OpenGL 是 SGI 公司开发的计算机图形处理零碎,是图形硬件的软件接口,GL 为图形库(Graphics Library),OpenGL 应用程序不须要关注所在运行环境所处的操作系统与平台。

只有在任何一个遵循 OpenGL 规范的环境下都会产生一样的可视化成果。与 OpenGL 相似,DirectX (Directe Xtension)也是一种图形 API。它是由 Microsoft 创立的多媒体编程接口,并曾经成为微软视窗的规范。为适应 GPU 利用的需要,DirectX 则依据 GPU 新产品性能的裁减与停顿及时地定义新的版本,它所提供的性能简直与 GPU 提供的性能同步

1.2.2、GPU 本身编程接口

GPU 本身提供的编程接口次要由提供 GPU 设施的两家公司提供,别离是括 NVIDIA 的 CUDA 框架和 AMD(ATI)公司于 2006 年提出了 CTM(Close To Metal)框架(备注,最后是 ATI 公司生产 GPU 设施,后被 AMD 收买)。AMD 的 CTM 框架当初已不在应用,次要是 AMD(ATI)于 2007 年推出了 ATI Stream SDK 架构,2008 年 AMD(ATI)齐全转向了公开的 OpenCL 规范,因而 AMD(ATI)公司目前已没有独立的、公有的通用计算框架。

2007 年 NVIDIA 公司公布 CUDA (Compute Unified Device Architecture)专用通用计算框架。应用 CUDA 进行通用计算编程不再须要借助图形学 API,而是应用与 C 语言以非常相似的形式进行开发。在 CUDA 编程模型中,有一个被称为主机 (Host) 的 CPU 和若干个被称作设施 (Device) 或者协处理器 (Co-Processor) 的 GPU。

在该模型中,CPU 和 GPU 协同工作,各司其职。CPU 负责进行逻辑性较强的事务处理和串行计算,而 GPU 则专一于执行线程化的并行处理工作。CPU、GPU 各自领有互相独立的存储器地址空间主机端的内存和设施端的显存。个别采纳 CUDA 框架本人进行编程的都是一些大型的应用程序,比方石油勘测、流体力学模仿、分子动力学仿真、生物计算、音视频编解码、地理计算等畛域。

而咱们个别企业级的应用程序因为开发成本以及兼容性等起因,大多数都是采纳通用的图形库来进行开发调用 GPU 设施。

1.3、GPU 如何工作?

GPU 对于通用计算机和图形处理的外部组件次要有两局部: 顶点处理器 (Vertex Processor) 和子素处理器(Fragment Processor)。这种处理器具备流处理机的模式,即不具备大容量的快存 / 存储器能够读写, 只是间接在芯片上利用长期寄存器进行流数据的操作。

当 GPU 用于图形处理时,此时 GPU 外部的顶点渲染、像素渲染以及几何渲染操作都能够通过流处理器实现。从图中能够看出,此时 GPU 外部的所有流处理器相当于一个多核的处理器,数据能够很不便地在不同的流处理器之间的输出和输入之间挪动,同时 GPU 分派器和管制逻辑能够动静的指派流处理器进行相应的顶点,像素,几何等操作,因为流处理器都是通用的。

二、GPU 虚拟化

开始咱们的正题,目前虚拟机零碎中的图形处理形式有三种:一种是采纳虚构显卡的形式,另一种是间接采纳物理显卡,最初是采纳 GPU 虚拟化。

2.1、虚构显卡

第一种采纳虚构显卡是当初支流的虚拟化零碎的抉择,因为业余的显卡硬件价格不菲。目前采纳虚构显卡的这些技术包含:

虚构网络计算机 VNC (Virtual Network Computing)
Xen 虚构帧缓存
VMware 虚构图形显示处理器 GPU (Graphics Processing Unit)
独立于虚拟机管理器的图形减速零碎 VMGL (VMM-Independent Graphics Acceleration)。
VNC(Virtual Network Computing)基本上是属于一种显示零碎, 也就是说它能将残缺的窗口界面通过网络,传输到另一台计算机的屏幕上。Windows 服务器中蕴含的 ”Terminal Server” 即是属于这种原理的设计。VNC 是由 AT&T 实验室所开发的,其采纳 GPL(General Public License)受权条款,任何人都可收费获得该软件。VNC 软件要由两个局部组成:VNC server 和 VNC viewer。用户需先将 VNC server 装置在被近程操控的计算机上后,能力在主控端执行 VNC viewer 进行近程操控。

XEN 虚构帧缓存是指 XEN 提供的一个虚构的显示设施。该虚构显示设施采纳特权域的 VNC 服务器,因而该虚构显示设施具备类似的 VNC 接口。客户机在 XEN 虚构帧缓存中写入数据,而后通过 VNC 协定来传输已批改的图片,最初告诉前端进行相应区域的更新。这个虚构帧缓存设施的源码是来自开源的 Qemu。咱们在 XenServer 上看见虚拟机的操作系统桌面界面,即是这种技术的显示。

虚构网络计算机 VNC 和 XEN 虚构帧缓存这两种模式至今在虚拟机中仍未提供肯定的硬件图形减速能力。因为目前仍没有一个机制能使虚拟机进行拜访图形硬件的能力,因而这些虚构的显示设施都是通过应用 CPU 以及内存的形式对图形数据进行相应解决。并没有采纳物理显示设施的性能。

然而 VMGL 这种模式曾经实现了这种机制,这个机制通常被称为前端 - 后端虚拟化机制(Front-end virtualization)。VMGL 这种模式采纳这个机制将须要图形处理的数据发送到一个领有硬件图形减速性能的虚构监控机上进行相应的图形数据处理。目前存在的比拟支流可用于 GPU 利用程序开发的图形处理接口有两类:OpenGL 和 Direct3D。

在这两类图形处理接口中,OpenGL 是惟一一类可能在支流操作系统中跨平台操作的图形 API 接口。在虚拟机平台中,VMGL 是首个针对 OpenGL API 进行虚拟化的我的项目。VMGL 的工作原理是,它在客户端操作系统中部署了一个伪库 (Fake Library) 用来取代规范的 OpenGL 库,伪库 (Fake Library) 领有与规范的 OpenGL 库雷同的接口,在客户端操作系统中的伪库也实现了指向近程服务器的宿主机操作系统的近程调用。

这样一来,所有的本地 OPENGL 调用都将被解释为对近程服务器的一次服务申请,近程服务器的宿主机操作系统领有真正的 OPENGL 库、显卡驱动和物理硬件 GPU,它负责实现 OPENGL 申请并将执行结果显示到屏幕上。因为 VMGL 在整个过程操作中都是齐全通明的,因而调用 OPENGL 的应用程序不须要批改源代码也不须要进行二进制改写,无需为虚拟机平台作任何改变。

2.2、显卡直通

显卡直通也叫做显卡穿透(Pass-Through),是指绕过虚拟机管理系统,将 GPU 独自调配给某一虚拟机,只有该虚拟机领有应用 GPU 的权限,这种独占设施的办法调配形式保留了 GPU 的完整性和独立性,在性能方面与非虚拟化条件下靠近,且能够用来进行通用计算。然而显卡直通须要利用显卡的一些非凡细节,同时兼容性差,仅在局部 GPU 中设施能够应用。

Xen 4.0 减少了 VGA Passthrough 技术,因而 XenServer 也领有了该技术,XenServer 的 Passthrough 就是利用英特尔设施虚拟化 (Intel VT-d) 技术将显示设施裸露给某一个客户虚拟机,不仅其它客户虚拟机不能拜访,就连宿主虚拟机也失去了应用该 GPU 的能力。它在客户虚拟机中实现了显卡的一些非凡细节,如 VGA BIOS、文本模式、IO 端口、内存映射、VESA 模式等,以反对间接拜访。应用 Xen Server 的 VGA Pass-Through 技术的 GPU 执行效率高,性能全,但只能被繁多零碎独占应用,失去了设施复用的性能。VMware ESXi 中包含一个 VM Direct Path I/ O 框架,应用该技术也能够将咱们的显卡设施直通给某一虚拟机进行应用。

XenServer 和 VMware 应用的是不同的技术然而实现的成果都是一样的,行将物理显卡设施直通给其中的某一虚拟机应用,以达到虚拟机进行 3D 显示和渲染的成果。

因为显卡直通实际上是由客户操作系统应用原生驱动和硬件,短少必要的中间层来跟踪和保护 GPU 状态,它不反对实时迁徙等虚拟机高级个性。如 XenServer Passthrough 禁止执行 Save/Restore/Migration 等操作。VMware 的虚拟机中,一旦开启 VMDirectPath I/ O 性能,其对应的虚拟机将失去执行挂起 / 复原、实时迁徙的能力。

2.3、显卡虚拟化(GPU 虚拟化)

显卡虚拟化就是将显卡进行切片,并将这些显卡工夫片调配给虚拟机应用的过程。因为反对显卡虚拟化的显卡个别能够依据须要切分成不同的规格的工夫片,因而能够调配给多台虚拟机应用。其实现原理其实就是利用应用层接口虚拟化(API remoting),API 重定向是指在应用层进行拦挡与 GPU 相干的应用程序编程接口(API),通过重定向(依然应用 GPU)的形式实现相应性能,再将执行后果返回应用程序。

咱们当初应用 Citrix 的 3D 桌面虚拟化解决方案中,大部分是应用 NVIDIA 公司提供的显卡虚拟化技术,即是 vCUDA(virtual CUDA)技术,后面咱们说过了 CUDA 框架,再此不在阐明。vCUDA 采纳在用户层拦挡和重定向 CUDA API 的办法,在虚拟机中建设物理 GPU 的逻辑映像——虚构 GPU,实现 GPU 资源的细粒度划分、重组和再利用,反对多机并发、挂起复原等虚拟机高级个性。

其 vCUDA 的实现原理大略包含三个模块:CUDA 客户端、CUDA 服务端和 CUDA 治理端。以 XenServer 为例,在物理硬件资源上运行着一个 VMM 用于向上提供硬件映像,在 VMM 上运行着若干个虚拟机。其中一个虚拟机为特权虚拟机(Host VM),即为 XenServer 中的 Domain 0,在虚拟机中运行的操作系统称为 Host OS。

Host OS 可能间接管制硬件,零碎内装置着原生的 CUDA 库以及 GPU 驱动,使得 Host OS 能够间接拜访 GPU 和应用 CUDA。其它的虚拟机属于非特权虚拟机 (Guest VM),其上运行的操作系统(Guest OS) 不能间接操纵 GPU。在这里咱们将 CUDA 客户端称之为客户端驱动,CUDA 服务端称之为宿主机的驱动,CUDA 治理端称之为 GPU 管理器。

2.3.1、客户端

客户端驱动其实质就是咱们装置在虚拟机比方 Windows 7 上的显卡驱动程序。次要的性能是在用户层提供针对 CUDA API 的库以及一个保护 CUDA 相干软硬件状态的虚构 GPU(vGPU)。客户端驱动间接面向 CUDA 应用程序,其作用包含:

1)拦挡应用程序中 CUDA API 调用;
2)抉择通信策略,为虚拟化提供更高层语义的反对;
3)对调用的接口和参数进行封装、编码;
4)对服务端返回的数据进行解码,并返回给利用。
此外,客户端驱动在第一个 API 调用到来之前,首先到治理端索取 GPU 资源。每一个独立的调用过程都必须到宿主治理端驱动申请资源,以实现对 GPU 资源和工作的实时调度。

此外,客户端驱动同时设置了 vGPU 用来保护与显卡相干的软硬件状态。vGPU 自身本质上仅仅是一个键值对的数据结构,在其中存储了以后应用的地址空间、显存对象、内存对象等,同时记录了 API 的调用秩序。当计算结果返回时,客户端驱动会依据后果更新 vGPU。

2.3.2、服务器端

服务端组件位于特权虚拟机 (XenServer 术语:特权域) 中的应用层。特权虚拟机能够间接与硬件交互,因而服务端组件能够间接操纵物理 GPU 来实现通用计算工作。

服务端面向实在 GPU,其作用包含:

1)接管客户端的数据报,并解析出调用和参数;
2)对调用和参数进行审核;
3)利用 CUDA 和物理 GPU 计算审核通过的调用;
4)将后果编码,并返回给客户端;
5)对计算零碎中反对 CUDA 的 GPU 进行治理。
此外,服务端运行的第一个工作是将本身反对 CUDA 的 GPU 设施的信息注册到治理端中。服务端应答客户端的申请时,为每个利用调配独立的服务线程。服务端对立治理本地 GPU 资源,依照肯定的策略提供 GPU 资源,并将因为 API 调用批改的相干软硬件状态更新至 vGPU。

2.3.3、治理端

治理端组件位于特权域,在实现 CUDA 编程接口虚拟化的根底上,将 GPU 弱小的计算能力和计算资源在更高的逻辑档次上进行隔离、划分、调度。在 CUDA 服务端应用计算线程和工作线程在肯定水平上使同在一个物理机上的 GPU 间负载平衡,设置 CUDA 治理端组件在更高的逻辑档次上进行负载平衡,使在同一个 GPU 虚构集群中的 GPU 负载平衡。

治理端组件调度的准则是尽量使在同一个物理机上的 GPU 需要自给,如果该物理机上具备满足条件的 GPU 资源,在个别状况下,该物理机上的虚拟机的 GPU 需要都重定向到该物理机的 CUDA 服务端。

治理端对 GPU 资源进行对立治理,采纳集中、灵便的机制,实现:

1)动静调度:当用户所占资源闲暇工夫超过肯定阈值或者工作完结时,治理端回收该资源,当该用户再次公布计算工作时,从新为其任务分配 GPU 资源;
2)负载平衡:当部分计算压力过大时,调整计算负载,通过动静调度时抉择适合的 GPU 资源来扩散计算负载;
3)故障复原:当呈现故障时,将工作转移到新的可用 GPU 资源上。

正文完
 0