GPU如何工作

http://www.cnblogs.com/twjcnblog/archive/2012/09/19/2682911.html



早在1990年,无处不在的交互式3D图形还只是科幻小说里的东西。十年后,基本上每台新电脑都包含一个图形处理单元(GPU,即Graphics processing unit)。直到今天,GPU的原始计算能力已经超越最强大的CPU,并且差距还在稳步增大。今天,GPU可以直接使用图形硬件来实现许多并行算法。那些利用底层计算能力的适当的算法常常会获得巨大的速度提升。

任何3D图形系统的任务都是根据一个场景的描述来合成一张图片 --- 对实时渲染图形学(例如游戏)来说是每秒60张。这个场景包含了可观察的几何图元以及灯光照亮场景的描述,每个对象反射光照的方式和观察者的位置、朝向。

图形管线输入

大多数实时图形系统假设所有东西都是由三角形组成的,它们首先将任何复杂的形状(例如四边形,曲面)划分为三角形。开发者使用图形库(例如OpenGL或者Direct3D)将每个三角形传递给图形管线,每次传递一个顶点,GPU根据需要将顶点组合成三角形。

模型转换

GPU能够以每个对象自己定义的本地坐标系来指定场景中的对象,这对于按层次定义的对象来说是很方便的。但这种方便是有代价的:在渲染前,GPU首先必须转换所有的对象到一个公共的坐标系中。为了确保三角形不会变形和扭曲,转换被限定在一些简单的仿射操作如旋转、平移、缩放以及类似的操作。这个阶段的输出是一连串的三角形,这些三角形被转换到一个公共的坐标系中,在这个坐标系中,观察者位于原点,朝向z轴正方向。

光照

一旦每个三角形都被转换到一个全局坐标系中,GPU就可以基于场景中的光源来计算它的颜色了。GPU通过累加每个独立的光源的贡献量来处理多光源效果。传统的图形管线支持Phong光照模型,Phong光照模型按如下公式输出颜色C = Kd × Li × (N.L) + Ks × Li × (R.V)^S,其中Kd是漫反射颜色,Li是光源颜色,N是表面法向量,L是顶点到光源的向量,Ks是镜面光颜色,R是光源到顶点的反射向量,V是顶点到摄像机的向量,S是光亮强度。

摄像机模拟

图形管线接着将每个着色的三角形投射到虚拟摄像机平面。这个阶段的输出是一连串在屏幕坐标系中的准备被转换为像素的三角形。

光栅化

每个可见的屏幕空间中的三角形在显示时会导致像素重叠,确定最佳接近图形的像素集合的过程成为光栅化。GPU设计者多年来合并了许多光栅化算法,都利用了至关重要的一点:每个像素都可以独立于其他任何像素被对待处理。因此,机器能够并行的处理所有像素 --- 确实有一些奇异的机器对于每一个像素都有一个处理器。这个固有的独立性导致GPU设计者去构建逐渐并行的管线集合。

纹理

尽管每个像素的颜色可以通过光照计算产生,但为了真实感,常常会在几何体上使用纹理。GPU把这些纹理存储在高速存储器中,当计算每个像素的颜色时需要访问该存储器。实际上,当纹理出现在屏幕上的尺寸比它的原始尺寸大或者小时,对于每个像素,GPU都需要多次访问纹理进行采样以减少视觉误差。由于对于存储纹理的高速存储器的访问模式通常非常有规则(邻近像素常常访问邻近的纹理坐标进行采样),所以特定的缓存设计将帮助隐藏存储器访问的延迟。

隐藏表面

在许多场景中,一些对象会遮掩另一些对象。如果每个像素只是被简单的写入显存的话,那么最近提交的三角面将会显示。所有的现代GPU都提供了一个深度缓存,深度缓存是用来存储每个像素到观察者的距离的一块内存区域。新像素在写入显存之前,GPU会将新像素到观察者的距离值与已经在深度缓存中的值进行比较,如果新像素到观察者的距离更近的话,GPU将会更新深度缓存中的值。

齐次坐标

在三维世界中通常将点表示为(x, y, z)。然而在计算机图形学中,添加第四个坐标w通常很有用。为了将一个点转换为新的表现形式,我们设置w = 1。当要还原回原始点的时候,我们执行下面的转换:(x, y, z, w) -> (x/w, y/w, z/w)。尽管乍看之下貌似没什么必要,但这种方式有巨大的优点。例如我们可以将向量(x, y, z)表示为(x, y, z, 0)。通过这种对于向量和点的统一的表示方法,我们就可以执行一些有用的变换,例如矩阵-向量乘法。

发展进化的图形管线

传统的图形管线只提供8位的整型值供颜色只用,允许的范围从0到255。ATI Radeon 9700开始支持24位的浮点值,NVIDIA GeForce FX则支持16位以及32位的浮点值。现在的显卡已经支持64位双精度浮点值了。为了赶得上对于图形性能的需求,GPU积极包含并行设计,现在的显卡的Stream Processors(流处理器)数量已经越来越多。

下图是发展进化的图形管线:

GPGPU

实时计算机图形的高度并行的工作量要求极高的运算吞吐量以及流内存带宽,但是因为最终的图片每16毫秒才显示一次,所以在单独计算中可以容忍相当大的延迟。这些特征塑造了底层GPU架构:GPU为高吞吐量进行优化,而CPU为低延迟进行优化。GPU的原始计算能力是十分惊人的:GeForce 8800芯片每秒可以执行3300亿次浮点运算操作。GPU不断增长的能力,可编程性以及精度激发了大量的通用计算图形硬件(general-purpose computation on graphics hardware)的研究 - 简称GPGPU。GPGPU的研究者和开发者使用GPU作为一个计算协处理器而不是图片合成设备


早在1990年,无处不在的交互式3D图形还只是科幻小说里的东西。十年后,基本上每台新电脑都包含一个图形处理单元(GPU,即Graphics processing unit)。直到今天,GPU的原始计算能力已经超越最强大的CPU,并且差距还在稳步增大。今天,GPU可以直接使用图形硬件来实现许多并行算法。那些利用底层计算能力的适当的算法常常会获得巨大的速度提升。

任何3D图形系统的任务都是根据一个场景的描述来合成一张图片 --- 对实时渲染图形学(例如游戏)来说是每秒60张。这个场景包含了可观察的几何图元以及灯光照亮场景的描述,每个对象反射光照的方式和观察者的位置、朝向。

图形管线输入

大多数实时图形系统假设所有东西都是由三角形组成的,它们首先将任何复杂的形状(例如四边形,曲面)划分为三角形。开发者使用图形库(例如OpenGL或者Direct3D)将每个三角形传递给图形管线,每次传递一个顶点,GPU根据需要将顶点组合成三角形。

模型转换

GPU能够以每个对象自己定义的本地坐标系来指定场景中的对象,这对于按层次定义的对象来说是很方便的。但这种方便是有代价的:在渲染前,GPU首先必须转换所有的对象到一个公共的坐标系中。为了确保三角形不会变形和扭曲,转换被限定在一些简单的仿射操作如旋转、平移、缩放以及类似的操作。这个阶段的输出是一连串的三角形,这些三角形被转换到一个公共的坐标系中,在这个坐标系中,观察者位于原点,朝向z轴正方向。

光照

一旦每个三角形都被转换到一个全局坐标系中,GPU就可以基于场景中的光源来计算它的颜色了。GPU通过累加每个独立的光源的贡献量来处理多光源效果。传统的图形管线支持Phong光照模型,Phong光照模型按如下公式输出颜色C = Kd × Li × (N.L) + Ks × Li × (R.V)^S,其中Kd是漫反射颜色,Li是光源颜色,N是表面法向量,L是顶点到光源的向量,Ks是镜面光颜色,R是光源到顶点的反射向量,V是顶点到摄像机的向量,S是光亮强度。

摄像机模拟

图形管线接着将每个着色的三角形投射到虚拟摄像机平面。这个阶段的输出是一连串在屏幕坐标系中的准备被转换为像素的三角形。

光栅化

每个可见的屏幕空间中的三角形在显示时会导致像素重叠,确定最佳接近图形的像素集合的过程成为光栅化。GPU设计者多年来合并了许多光栅化算法,都利用了至关重要的一点:每个像素都可以独立于其他任何像素被对待处理。因此,机器能够并行的处理所有像素 --- 确实有一些奇异的机器对于每一个像素都有一个处理器。这个固有的独立性导致GPU设计者去构建逐渐并行的管线集合。

纹理

尽管每个像素的颜色可以通过光照计算产生,但为了真实感,常常会在几何体上使用纹理。GPU把这些纹理存储在高速存储器中,当计算每个像素的颜色时需要访问该存储器。实际上,当纹理出现在屏幕上的尺寸比它的原始尺寸大或者小时,对于每个像素,GPU都需要多次访问纹理进行采样以减少视觉误差。由于对于存储纹理的高速存储器的访问模式通常非常有规则(邻近像素常常访问邻近的纹理坐标进行采样),所以特定的缓存设计将帮助隐藏存储器访问的延迟。

隐藏表面

在许多场景中,一些对象会遮掩另一些对象。如果每个像素只是被简单的写入显存的话,那么最近提交的三角面将会显示。所有的现代GPU都提供了一个深度缓存,深度缓存是用来存储每个像素到观察者的距离的一块内存区域。新像素在写入显存之前,GPU会将新像素到观察者的距离值与已经在深度缓存中的值进行比较,如果新像素到观察者的距离更近的话,GPU将会更新深度缓存中的值。

齐次坐标

在三维世界中通常将点表示为(x, y, z)。然而在计算机图形学中,添加第四个坐标w通常很有用。为了将一个点转换为新的表现形式,我们设置w = 1。当要还原回原始点的时候,我们执行下面的转换:(x, y, z, w) -> (x/w, y/w, z/w)。尽管乍看之下貌似没什么必要,但这种方式有巨大的优点。例如我们可以将向量(x, y, z)表示为(x, y, z, 0)。通过这种对于向量和点的统一的表示方法,我们就可以执行一些有用的变换,例如矩阵-向量乘法。

发展进化的图形管线

传统的图形管线只提供8位的整型值供颜色只用,允许的范围从0到255。ATI Radeon 9700开始支持24位的浮点值,NVIDIA GeForce FX则支持16位以及32位的浮点值。现在的显卡已经支持64位双精度浮点值了。为了赶得上对于图形性能的需求,GPU积极包含并行设计,现在的显卡的Stream Processors(流处理器)数量已经越来越多。

下图是发展进化的图形管线:

GPGPU

实时计算机图形的高度并行的工作量要求极高的运算吞吐量以及流内存带宽,但是因为最终的图片每16毫秒才显示一次,所以在单独计算中可以容忍相当大的延迟。这些特征塑造了底层GPU架构:GPU为高吞吐量进行优化,而CPU为低延迟进行优化。GPU的原始计算能力是十分惊人的:GeForce 8800芯片每秒可以执行3300亿次浮点运算操作。GPU不断增长的能力,可编程性以及精度激发了大量的通用计算图形硬件(general-purpose computation on graphics hardware)的研究 - 简称GPGPU。GPGPU的研究者和开发者使用GPU作为一个计算协处理器而不是图片合成设备

<think>好的,我现在需要帮助用户了解GPU工作原理,并且通过图解形式学习。首先,我要回顾一下用户提供的引用内容,确保信息准确可靠。 根据引用[1],GPU是图形处理器,同样可以进行计算。引用[2]提到GPU的架构与CPU差异大,流处理器和显存控制器占大部分晶体管。引用[3]则介绍了微处理器的基本概念,包括GPU在内的各种处理单元。 用户的需求是GPU工作原理和架构图解。首先,我需要解释GPU的基本功能,然后对比CPU和GPU的结构差异,说明为什么GPU适合并行计算。接着,应该描述GPU的核心组件,如流处理器、显存控制器等,以及图形处理流程的各个阶段,比如顶点着色、光栅化、片元着色等。最后,附上图解示意图,并用文字描述图解内容,因为实际无法插入图片。 需要确保使用正确的LaTeX格式,行内公式用$...$,独立公式用$$...$$。同时,生成相关问题,并正确添加引用标识。可能的问题包括GPU与CPU的区别、流处理器的作用、图形管线阶段等。 现在,整理信息,分步骤说明GPU工作原理,结构清晰,符合用户要求的中文回答,并确保引用标注正确。最后生成相关问题,帮助用户进一步学习。</think>### GPU工作原理与架构图解 GPU(Graphics Processing Unit)是专门为图形渲染和并行计算设计的处理器。其核心思想是通过大量简单的计算单元并行处理数据,与CPU的复杂控制逻辑形成鲜明对比[^2]。 #### 一、GPU与CPU架构对比 $$CPU架构示意图:控制单元+ALU+缓存 \quad vs \quad GPU架构示意图:数千个流处理器集群+显存控制器$$ 1. **CPU**:少量复杂核心,适合处理逻辑分支和串行任务 2. **GPU**:包含$N \times M$个流处理器(Stream Processors),每个处理器可执行简单指令,适合并行处理矩阵运算、像素计算等任务[^2] #### 二、GPU核心组件 1. **流处理器阵列** - 包含多个计算单元(CUDA Core/Stream Processor) - 每个单元可执行浮点运算和整数运算 2. **显存控制器** - 管理GDDR显存的高速访问 - 带宽可达$512\,GB/s$以上 3. **纹理映射单元** - 负责贴图采样与过滤 4. **光栅化引擎** - 将3D几何数据转换为2D像素 #### 三、图形处理流程(渲染管线) ```mermaid graph TB A[顶点数据] --> B(顶点着色器) B --> C{图元装配} C --> D[几何着色器] D --> E(光栅化) E --> F(片元着色器) F --> G[输出合并] ``` 1. **顶点处理**:通过顶点着色器计算物体空间位置 $$v' = MVP \times v \quad (模型-视图-投影矩阵变换)$$ 2. **光栅化**:将三角形转换为像素片段 3. **像素处理**:执行材质贴图、光照计算等操作 4. **输出合并**:处理深度测试、透明度混合等 #### 四、通用计算原理(GPGPU) 现代GPU通过计算着色器支持通用计算,典型应用包括: - 矩阵运算:$C_{ij} = \sum_{k=1}^n A_{ik} \times B_{kj}$ - 物理模拟:粒子系统运动计算 - 深度学习:神经网络参数优化 [图解说明] 假设GPU包含2个流处理器集群(GPC),每个集群包含: - 4个纹理处理集群(TPC) - 每个TPC包含2个流式多处理器(SM) - 每个SM包含64个CUDA核心 这种架构可实现$2 \times 4 \times 2 \times 64 = 1024$线程并行执行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值