近距离看GPU计算-1

news2025/2/23 10:21:33

文章目录

  • 前言
  • 1.什么是GPU及其分类
    • 1.独立GPU(Discrete GPU)
    • 2.集成GPU(Integrated GPU)
    • 3.移动GPU(Mobile GPU)
  • 2.GPU绘制流水线
  • 3.GPU计算的演进之旅
    • 1.CUDA的发明
    • 2.统一可编程单元
    • 3.浮点计算的标准化
    • 4.随机存取数据
    • 5.存储支持ECC

前言

转自 GPU and Computing 公众号

在前面文章中,我们交代了计算平台相关的一些基本概念以及为什么以GPU为代表的专门计算平台能够取代CPU成为大规模并行计算的主要力量。在接下来的文章中,我们会近距离从软硬件协同角度讨论GPU计算如何开展。跟先前的文章类似,笔者会采用自上而下,从抽象到具体的方式来论述。希望读者不只是对GPU计算能有所理解,而且能够从中了解可以迁移到其它计算平台的知识,此是笔者之愿景,能否实现一二,还恳请各位看官不断反馈指正,欢迎大家在后台留言交流。在本文中,我们首先介绍下GPU及其分类,并简单回顾下GPU绘制流水线的运作,最后又如何演化为通用计算平台。


1.什么是GPU及其分类

按维基百科定义,GPU(Graphics Processing Unit,图形处理器)是一种专门在个人电脑、工作站、游戏机和一些移动设备(如平板电脑、智能手机等)上运行绘图运算工作的微处理器。为了以后讨论方便,这里先给市面的GPU按配置大致做个分类,分类之间界限比较模糊,不一定完全准确。

1.独立GPU(Discrete GPU)

独立GPU(Discrete GPU),或者独立显卡。是指GPU通过PCI Express或者早期的AGP、PCI等扩展接口与主板连接。所谓的“独立”即是指显卡内的RAM只会被该GPU专用,而不是指显卡是否可从主板上移除。由于尺寸和重量的限制,供笔记本电脑使用的独立GPU通常会通过非标准的接口作连接,然而由于逻辑接口相同,这些接口仍会被视为PCIE,即使在物理上它们是不可与其他显卡互换。一些专门的GPU互联技术,如NVIDIA的SLI、NVLink和AMD的CrossFire等允许多个独立GPU协同工作,可显著增强设备的图形处理能力。独立GPU价格高,体积大,功耗高,但性能更强劲,而且因为自带显存,消耗的系统资源也更少
在这里插入图片描述

2.集成GPU(Integrated GPU)

集成GPU(Integrated GPU), 或者集成显卡。是集成在主板或CPU上的GPU,运行时会占用部分的系统内存,相比起使用独立显卡的方案,这种方案较为便宜,但性能也相对较低。从2009年开始,集成GPU已经从主板移至CPU了,Intel将之称为HD Graphics(核芯显卡),AMD也推出了集成了CPU和GPU的APU。将GPU集成至处理器的好处是可以降低功耗,提升性能。随着技术的成熟,目前的集成GPU已经足够应付基本3D的需求,不过由于仍然依赖主板本身的RAM,相比独立显卡,访存带宽始终是个不小的限制。
在这里插入图片描述

3.移动GPU(Mobile GPU)

移动GPU(Mobile GPU)。在移动设备领域,随着手机以及平板电脑等设备对图形处理能力的需求越来越高,GPU也成为移动处理器(SoC)的标配,高通、Imagination和ARM等等都在这个领域大显身手。我们在以前的文章提到过,苹果抛弃Imagination的PowerVR IP,在新近的产品采用自研GPU,也成为一股不可忽视的力量。因为移动设备散热和电池供电的限制,功耗是GPU设计首要考虑的问题,所以移动GPU相比其它GPU架构方面会有不小差异。
在这里插入图片描述

以后谈到GPU计算的时候,我们主要还是以高性能为诉求。所以如果上下文没有特别说明,我们一般都是针对独立GPU。

2.GPU绘制流水线

在这节我们会简单的介绍GPU的绘制流水线(Rendering Pipeline),GPU就是为图形绘制加速而生,知道它的来龙去脉,有助于我们理解在其基础之上衍生的GPGPU。GPU绘制的过程,类似我们生活中拍照和写生,是有关如何把三维空间的场景在二维的屏幕上能尽量真实的呈现出来。我们以写生来做譬喻,针对特定场景输入,择一视点,取景构图,按照透视比例通过点线面勾勒出物体的边界和轮廓,确定明暗色调,注意远近关系多层次描绘
在这里插入图片描述

与采用画笔、相机等工具不同,3D图形程序通过调用OpenGL(ES)、Direct3D或者Vulcan API的接口函数来同GPU硬件交互。为方便论述又不失代表性,下图是一个相对目前GPU简化的绘制管线,基本上相当于OpenGL(ES) 2.0或者Direct3D 9.0的规格,绘制管线主要有以下步骤构成。值得注意的是,管线分为可编程单元以及固定功能(fixed function)单元,后者优化处理管线中不容易并行化的工作,显然各种Shader都在可编程单元执行

在这里插入图片描述

顶点数据输入。3D程序需要的三维场景可以通过3ds Max、Maya等专业软件来建模,生成的模型可以有成千上万个三角面片网格构成,其中不仅规定顶点的位置、颜色、纹理坐标和法向量等等属性也包括它们之间的连接信息。模型导入3D程序以后,就可以成为3D程序的顶点数据流,顶点数据为为后面的Vertex Shader等阶段提供待处理的数据。

Vertex Shader(顶点着色器)。Vertex Shader的主要功能是对顶点属性进行变换,包括顶点位置的坐标转换,从局部坐标统一到世界坐标并切换到视点坐标以至裁剪坐标。以前也在Vertex Shader进行光照颜色计算,但是由于不够真实,目前一般移到Fragment Shader阶段才发生。Vertex Shader的输入输出都是顶点。

Primitive Setup(图元装配)和Rasterization(光栅化)。图元装配是将变换后的的顶点根据连接信息组装成指定的图元。图元装配阶段会进行裁剪(clip)和背面剔除(backface culling)相关的优化,可以减少不必要的工作量。另外还需要透视除法(Perspective Division)达到透视效果,然后通过视口变化(Viewport Transformation)最终得到顶点的屏幕坐标。在光栅化阶段,基本图元被转换为一组二维的片元(fragment),片元表示将来可以被渲染到屏幕上的像素,它包含有位置,颜色,纹理坐标等信息,这些属性是由图元的相关顶点信息进行插值计算得到的。这些片元接着被送到Fragment Shader处理。

Fragment Shader(片元着色器)。片元着色器用来决定屏幕上潜在像素的最终颜色。在这个阶段会依据纹理坐标进行纹理采样、计算光照以及处理阴影等等,是绘制管线产生高级效果所在。

测试合成。测试合成是绘制管线的最后一个步骤。主要测试有裁剪测试(Scissor Test)、模板测试(Stencil Test)以及深度测试(Depth Test),深度测试就是确认进入的片元有没有被Framebuffer(帧缓存)同样位置的像素遮挡。通过最终测试的片元会进入合成阶段,就是进入的片元和Framebuffer已有的像素进行混合,根据颜色的Alpha值取代现有像素或混合产生半透明的效果。Alpha表示的是物体的透明度。测试合成阶段不是可编程的,但是我们依旧可以通过3D API提供的接口函数进行动态配置,并进一步定制测试和混合的方式。
在这里插入图片描述
上面的步骤针对接口函数其中一个绘制命令,而一帧画面一般需要很多个绘制命令才能完成,等一帧内容结束以后,该Framebuffer就会作为新的Front Buffer交由显示设备显示,而先前显示的Front Buffer会变成Back Buffer又开始下一帧的绘制之旅。这就是GPU的双缓存(Double Buffering)策略。在上层应用程序可以通过3D API的接口函数调用GPU功能,在底层GPU驱动将这些接口函数转化为各种GPU私有的命令执行,它们可以完成绘制,状态寄存器设置以及同步等任务。CPU和GPU通过Ring Buffer(环形缓存)来传递和接受这些命令,CPU承担Ring Buffer生产者的角色,而GPU扮演消费者的角色,因为Ring Buffer大小有限,CPU和GPU需要同步。如果CPU老是要等GPU,我们说这个程序是GPU Bound,我们可能需要去优化Shader程序,减少三角面片数量来提高性能。相反如果GPU老是要等CPU,我们就认定这个程序是CPU Bound, 应用程序可以考虑把一些CPU预处理移交给GPU解决,比如利用GPU绘制管线支持的Geometry Shader(几何着色器)和Tessellation Shaders(细分曲面着色器)来生成额外顶点和图元,而不是等待CPU输入等等。
在这里插入图片描述

3.GPU计算的演进之旅

随着真实感绘制进一步发展,对图形性能要求愈来愈高,GPU发展出前所未有的浮点计算能力以及可编程性。这种远超CPU的计算吞吐和内存带宽使得GPU不只是在图形领域独领风骚,也开始涉足其它非图形并行计算应用。最早通过使用3D API OpenGL或者DirectX接口函数,很多数据并行算法被移植到GPU,性能也获得很好提升,但是这种利用模式面临不少问题,下面具体看看一步步是如何解决的。

1.CUDA的发明

之前的GPGPU实现需要并行算法程序员很熟悉图形API和GPU硬件,算法输入输出需要定义为图形绘制的元素,比如顶点坐标,纹理,帧缓存等,而实际算法又必须用着色程序(Shader Program)来表达,极大增加了通用并行算法在GPU上移植开发的复杂度,另外受限图形API的表达能力,很多并行问题没办法有效发挥GPU的潜力。2006年,Nvidia破天荒地推出CUDA,作为GPU通用计算的软件平台和编程模型,它将GPU视为一个数据并行计算的设备,可以对所进行的计算分配和管理。在CUDA框架中,这些计算不像过去那样必须映射到图形API,因此对于开发者来说,基于CUDA的开发门槛大大降低了。CUDA编程语言基于标准的C语言,一般用户也很容易上手开发CUDA的应用程序。

2.统一可编程单元

早些时候的GPU绘制管线都是固定功能的,不存在可编程部分。后来出现了可编程的Vertex和Fragment处理,极大地丰富了绘制效果,但是Vetex和Fragment的处理单元还是分离的,很容易造成负载不均衡,性能的伸缩性也不好。伴随着Direct3D 10(Shader Model 4.0)出现,GPU开始用统一的处理单元运行Vertex、Fragment以及Geomerty Shader。对通用并行计算而言,配合CUDA框架,只要增加GPU可编程处理器数量配置,这种统一处理方式就能够最大限度地扩展性能,影响非常深远。
在这里插入图片描述

3.浮点计算的标准化

GPU的可编程处理单元是面向浮点运算,但是浮点数的支持之前几乎每个GPU厂商都有自己的解决方案,精度、舍入的处理都不一致,导致计算的准确度存在明显差异。比如绘制管线倾向于把溢出(overflow),下溢(underflow)和非规格化浮点数(denorms)截断为可表示有意义的最大值或者最小值。现在GPU增加了对特殊数值(Special Values)Infinity和NaN的支持,计算过程的精度和准确度也向IEEE 754标准要求靠拢,比如下图演示的FMA。浮点计算除支持半精度和单精度以外,双精度的支持也不可或缺。另外除了浮点数,GPU也开始支持各种各样的整形运算。这些数据类型的支持对GPU通用计算的重要意义不言而喻。

4.随机存取数据

传统的GPU架构只有非常有限的寻址能力,如通过提供纹理坐标给纹理处理单元读取纹理数据,Fragment Shader把像素最终的颜色值输出到对应的帧缓存位置,这些读写过程用户没有办法显式控制,非常限制通用计算的数据交互能力。现在的的GPU增加了额外的存取单元,在指令集中增加统一寻址存取指令,很大程度拓展了GPU通用计算应用空间。

5.存储支持ECC

随着制程工艺不断进步,器件尺寸缩小,DRAM和SRAM的永久性故障(Hard Error)和瞬时间失效(Soft Error)错误都会增加,尤其后者在电容储存电荷量较小的情况下,问题会越来越严重。GPU当然也不能幸免,从显存,到多级cache以至寄存器文件(Register File)都暴露在这一风险之下。对图形应用来说,这一问题并不需要太多担心,人们根本意识不到屏幕上几百万个像素中个别颜色值中一位或几位bit出现了翻转,哪怕发生更严重的错误,人类的视觉机制都有机会自我补偿纠正。但在高性能计算领域,差之毫厘,谬以千里,这些存储失效的问题都是不能承受之重。所以现在GPU厂商至少会针对HPC产品在整个存储器层次结构添加ECC(Error Correcting Code)支持,数据中心和服务器的客户也才敢放心购买使用
在这里插入图片描述
有了以上一些改进和其他措施,终于GPU作为通用计算平台慢慢脱离原始阶段,开始成熟起来,成为大规模并行计算市场的主力军。在下篇文章中,我们会具体分析GPU不同于CPU的架构特点,重点介绍计算线程的硬件调度模式,敬请关注。

主要参考资料

  1. https://en.wikipedia.org/wiki/Graphics_processing_unit
  2. https://www.khronos.org/opengl/wiki/Rendering_Pipeline_Overview
  3. 细说图形学渲染管线
  4. The Evolution of GPU Accelerated Computing
  5. The Case for ECC Memory in Nvidia’s Next GPU
  6. NVIDIA’s Next Generation CUDATM Compute Architecture: Fermi

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1029740.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java实现单链表

目录 一.单链表 二.单链表基本操作的实现 1.单链表类、属性的定义 2.求链表长度 3.链表是否包含值为key的节点 4.添加元素 5.删除节点 6.清空链表 三、完整代码 一.单链表 链表是一种在物理存储结构上非连续的存储结构,数据元素的逻辑顺序通过链表中的引用…

【深度学习】卷积神经网络(LeNet)【文章重新修改中】

卷积神经网络 LeNet 前言LeNet 模型代码实现MINST代码分块解析1 构建 LeNet 网络结构2 加载数据集3 初始化模型和优化器4 训练模型5 训练完成 完整代码 Fashion-MINST代码分块解析1 构建 LeNet 网络结构2 初始化模型参数3 加载数据集4 定义损失函数和优化器5 训练模型 完整代码…

AIDAO,将会引领我们走向何方?

人工智能(AI)和分布式自治组织(DAO)都是区块链赛道的热门项目之一,他们看似在不同的领域独立发展,然而,它们之间也存在着巨大的协同潜力。 未来,AI有望成为推动DAO发展的重要动力&a…

【Java 基础篇】Java并发包详解

多线程编程是Java开发中一个重要的方面,它能够提高程序的性能和响应能力。然而,多线程编程也伴随着一系列的挑战,如线程安全、死锁、性能问题等。为了解决这些问题,Java提供了一套强大的并发包。本文将详细介绍Java并发包的各个组…

Docker网络问题:容器无法访问外部网络

Docker网络问题:容器无法访问外部网络 😟 Docker网络问题:容器无法访问外部网络 😟摘要 🤔引言 🌐正文 🤓为什么容器无法访问外部网络? 😕1. 网络配置错误2. 防火墙设置3…

WebGL 选中物体

目录 前言 如何实现选中物体 示例程序(PickObject.js) 代码详解 gl.readPixels()函数规范 示例效果 前言 有些三维应用程序需要允许用户能够交互地操纵三维物体,要这样做首先就得允许用户选中某个物体。对物体…

三维建模软件Cinema 4D 2024 mac(c4d2024)中文版特点

Cinema 4D 2024 mac是一款专业的三维建模、动画和渲染软件,c4d2024 可以用于电影制作、广告设计、工业设计等领域。 Cinema 4D 2024具有强大的建模工具,可以创建各种复杂的几何体,包括多边形网格、NURBS曲线和体积对象。它还提供了丰富的材质…

Docker快速入门到项目部署,MySQL部署+Nginx部署

《Docker》是微服务在企业落地的最后一块拼图。微服务项目由于拆分粒度细,服务部署环境复杂,部署实例很多,维护困难。而Docker则可以解决项目部署的各种环境问题,让开发、运维一体化,真正实现持续集成、持续部署。大大…

一文详解自动化测试框架知识

前言 自动化测试因其节约成本、提高效率、减少手动干预等优势已经日渐成为测试人员的“潮流”,从业人员日益清楚地明白实现自动化框架是软件自动化项目成功的关键因素之一。 我们将从什么是真正的自动化测试框架、自动化脚本如何工作以及自动化测试框架会如何在测…

three.js——辅助器AxesHelper和轨道控制器OrbitControls的使用

辅助器AxesHelper和轨道控制器OrbitControls的使用 前言效果图1、辅助器AxesHelper:是物体出现辅助的x/y/z轴2、轨道控制器OrbitControls2.1导入OrbitControls文件2.2 使用2.3 如果OrbitControls改变了相机参数,重新调用渲染器渲染三维场景 前言 1、AxesHelper 官网…

搭建GraphQL服务

js版 GraphQL在 NodeJS 服务端中使用最多 安装graphql-yoga: npm install graphql-yoga 新建index.js: const {GraphQLServer} require("graphql-yoga")const server new GraphQLServer({ typeDefs: type Query { hello(name:String):String! …

由于找不到vcruntime140_1.dll怎么修复,详细修复步骤分享

在使用电脑过程中,可能会遇到一些错误提示,其中之一是找不到vcruntime140_1.dll的问题。这使得许多用户感到困扰,不知道该如何解决这个问题。小编将详细介绍vcruntime140_1.dll的作用以及解决找不到该文件的方法,帮助你摆脱困境。…

前端进阶--深入理解JavaScript

1、JS的作用域和作用域链 作用域链的作用是保证对执行环境有权访问的所有变量和函数的有序访问,通过作用域链,我们可以访问到外层环境的变量和函数。作用域链的本质上是一个指向变量对象的指针列表。变量对象是一个包含了执行环境中所有变量和函数的对象…

openpnp - use STM32 arduino on SchultzController

文章目录 openpnp - use STM32 arduino on SchultzController概述笔记官方的起始文档增加arduino第三方开发板库索引地址改好后, 能编译过的工程SchultzController.inoFeeder.hFeeder.cpp再验证一下内存是否够用补充 - 如果是自己做的板子END openpnp - use STM32 arduino on S…

开发者福利!李彦宏将在百度世界大会手把手教你做AI原生应用

目录 一、写在前面 二、大模型社区 2.1 加入频道 2.2 创建应用 一、写在前面 1. “把最先进的技术用到极致,把最先进的应用做到极致。” 2. “每个产品都在热火朝天地重构,不断加深对AI原生应用的理解。” 3. “这就是真正的AI原生应用,这…

深度学习修炼(三)卷积操作 | 边界填充、跨步、多输入输出通道、汇聚池化

文章目录 1. 卷积基本操作2 现代卷积进阶武器操作2.1 边界 填充2.2 跨步 步幅2.3 多输入输出通道2.4 汇聚 池化 3. 卷积层设计 之前我们讲了 线性分类器 深度学习修炼(一)线性分类器 | 权值理解、支撑向量机损失、梯度下降算法通俗理解_Qodi的博客-CSDN博…

看完这篇 教你玩转渗透测试靶机Vulnhub——Toppo: 1

Vulnhub靶机Toppo: 1渗透测试详解 Vulnhub靶机介绍:Vulnhub靶机下载:Vulnhub靶机安装:①:信息收集:②:SSH登入:③:SUID提权(python2.7):④&#x…

JAVA面经整理(2)

一)解决哈希冲突的方法有哪些? 哈希冲突指的是在哈希表中,不同的键值映射到了相同的哈希桶,也就是数组索引,导致键值对的冲突 1)设立合适的哈希函数:通过哈希函数计算出来的地址要均匀的分布在整个空间中 2)负载因子调节: 2.1)开放…

Python yaml 详解

文章目录 1 概述1.1 特点1.2 导入 2 对象2.1 字典2.2 数组2.3 复合结构 3 操作3.1 读取3.2 写入 1 概述 1.1 特点 yaml 文件是一种数据序列化语言,广泛用于配置文件、日志文件等特点: ① 大小写敏感。② 使用缩进表示层级关系。缩进时不允许使用 Tab 键…

【VastbaseG100】 FATAL: The account has been locked.

使用VastbaseG100 数据库,查询数据报错。 org.postgresql.util.PSQLException: FATAL: The account has been locked. 帐户已被锁定。 解锁账户呗 ALTER ROLE doc ACCOUNT UNLOCK;ALTER ROLE 用户名 ACCOUNT UNLOCK; 修改密码 ALTER ROLE doc IDENTIFIED BY ZhangS…