最全GPU架构知识介绍

2023-05-16

640?wx_fmt=jpeg

640?wx_fmt=gif&wxfrom=5&wx_lazy=1

1、GPU的起源


GPU缩写为Graphics Processing Unit的,一般称为视觉处理单元。GPU被广泛用于嵌入式系统、移动电话、个人电脑、工作站和电子游戏解决方案当中。现代的GPU对图像和图形处理是十分高效率的,这是因为GPU被设计为很高的并行架构这样使得比通用处理器CPU在大的数据块并行处理算法上更具有优势。


1985年 8月20日 ATi公司成立,同年10月ATi使用ASIC技术开发出了第一款图形芯片和图形卡,1992年 4月 ATi发布了 Mach32 图形卡集成了图形加速功能,1998年 4月 ATi被IDC评选为图形芯片工业的市场领导者,但那时候这种芯片还没有GPU的称号,很长的一段时间ATI都是把图形处理器称为VPU,直到AMD收购ATI之后其图形芯片才正式采用GPU的名字。


NVIDIA公司在1999年发布GeForce 256图形处理芯片时首先提出GPU的概念。从此NVIDIA显卡的芯片就用这个新名字GPU来称呼。GPU使显卡削减了对CPU的依赖,并执行部分原本CPU的工作,尤其是在3D图形处理时。GPU所采用的核心技术有钢体T&L、立方环境材质贴图与顶点混合、纹理压缩及凹凸映射贴图、双重纹理四像素256位渲染引擎等,而硬体T&L技术能够说是GPU的标志。


2、工作原理


2.1、GPU工作流程简介

GPU的图形(处理)流水线完成如下的工作:(并不一定是按照如下顺序):


  • 顶点处理:这阶段GPU读取描述3D图形外观的顶点数据并根据顶点数据确定3D图形的形状及位置关系,建立起3D图形的骨架。在支持DX8和DX9规格的GPU中,这些工作由硬件实现的VertexShader(定点着色器)完成。


  • 光栅化计算:显示器实际显示的图像是由像素组成的,我们需要将上面生成的图形上的点和线通过一定的算法转换到相应的像素点。把一个矢量图形转换为一系列像素点的过程就称为光栅化。例如,一条数学表示的斜线段,最终被转化成阶梯状的连续像素点。


  • 纹理帖图:顶点单元生成的多边形只构成了3D物体的轮廓,而纹理映射(texturemapping)工作完成对多变形表面的帖图,通俗的说,就是将多边形的表面贴上相应的图片,从而生成“真实”的图形。TMU(Texturemapping unit)即是用来完成此项工作。


  • 像素处理:这阶段(在对每个像素进行光栅化处理期间)GPU完成对像素的计算和处理,从而确定每个像素的最终属性。在支持DX8和DX9规格的GPU中,这些工作由硬件实现的Pixel Shader(像素着色器)完成最终输出,由ROP(光栅化引擎)最终完成像素的输出,1帧渲染完毕后,被送到显存帧缓冲区。

在GPU出现之前,CPU一直负责着计算机中主要的运算工作,包括多媒体的处理工作。CPU的架构是有利于X86指令集的串行架构,CPU从设计思路上适合尽可能快的完成一个任务。


但是如此设计的CPU在多媒体处理中的缺陷也显而易见:多媒体计算通常要求较高的运算密度、多并发线程和频繁地存储器访问,而由于X86平台中CISC(Complex Instruction Set Computer)架构中暂存器数量有限,CPU并不适合处理这种类型的工作。


以Intel为代表的厂商曾经做过许多改进的尝试,从1999年开始为X86平台连续推出了多媒体扩展指令集SSE(Streaming SIMD Extensions)的一代到四代版本,但由于多媒体计算对于浮点运算和并行计算效率的高要求,CPU从硬件本身上就难以满足其巨大的处理需求,仅仅在软件层面的改并不能起到根本效果。


对于GPU来说,它的任务是在屏幕上合成显示数百万个像素的图像,也就是同时拥有几百万个任务需要并行处理,因此GPU被设计成可并行处理很多任务,而不是像CPU那样完成单任务。


因此CPU和GPU架构差异很大,CPU功能模块很多,能适应复杂运算环境;GPU构成则相对简单,目前流处理器和显存控制器占据了绝大部分晶体管。


CPU中大部分晶体管主要用于构建控制电路(比如分支预测等)和Cache,只有少部分的晶体管来完成实际的运算工作。而GPU的控制相对简单,且对Cache的需求小,所以大部分晶体管可以组成各类专用电路、多条流水线,使得GPU的计算速度有了突破性的飞跃,拥有了更强大的处理浮点运算的能力。

640?wx_fmt=png

图2-1 CPU和GPU架构


从硬件设计上来讲,CPU 由专为顺序串行处理而优化的几个核心组成。另一方面,GPU则由数以千计的更小、更高效的核心组成,这些核心专为同时处理多任务而设计。

640?wx_fmt=png

图2-2 串行运算示意图


640?wx_fmt=png

图2-3 并行运算示意图


通过上图我们可以较为容易地理解串行运算和并行运算之间的区别。传统的串行编写软件具备以下几个特点:要运行在一个单一的具有单一中央处理器(CPU)的计算机上;一个问题分解成一系列离散的指令;指令必须一个接着一个执行;只有一条指令可以在任何时刻执行。


而并行计算则改进了很多重要细节:要使用多个处理器运行;一个问题可以分解成可同时解决的离散指令;每个部分进一步细分为一系列指示;每个部分的问题可以同时在不同处理器上执行。提高了算法的处理速度。


3、GPU加速技术


3.1、CUDA

为充分利用GPU的计算能力,NVIDIA在2006年推出了CUDA(ComputeUnifiedDevice Architecture,统一计算设备架构)这一编程模型。CUDA是一种由NVIDIA推出的通用并行计算架构,该架构使GPU能够解决复杂的计算问题。它包含了CUDA指令集架构(ISA)以及GPU内部的并行计算引擎。开发人员现在可以使用C语言来为CUDA架构编写程序。


通过这个技术,用户可利用NVIDIA的GeForce 8以后的GPU和较新的QuadroGPU进行计算。以GeForce 8800 GTX为例,其核心拥有128个内处理器。利用CUDA技术,就可以将那些内处理器串通起来,成为线程处理器去解决数据密集的计算。而各个内处理器能够交换、同步和共享数据。


从CUDA体系结构的组成来说,包含了三个部分:开发库、运行期环境和驱动。

开发库是基于CUDA技术所提供的应用开发库。CUDA的1.1版提供了两个标准的数学运算库:CUFFT (离散快速傅立叶变换)和CUBLAS(离散基本线性计算)的实现。这两个数学运算库所解决的是典型的大规模的并行计算问题,也是在密集数据计算中非常常见的计算类型。开发人员在开发库的基础上可以快速、方便的建立起自己的计算应用。此外,开发人员也可以在CUDA的技术基础上实现出更多的开发库。


运行期环境提供了应用开发接口和运行期组件,包括基本数据类型的定义和各类计算、类型转换、内存管理、设备访问和执行调度等函数。基于CUDA开发的程序代码在实际执行中分为两种,一种是运行在CPU上的宿主代码(HostCode),一种是运行在GPU上的设备代码(Device Code)。


不同类型的代码由于其运行的物理位置不同,能够访问到的资源不同,因此对应的运行期组件也分为公共组件、宿主组件和设备组件三个部分,基本上囊括了所有在GPGPU开发中所需要的功能和能够使用到的资源接口,开发人员可以通过运行期环境的编程接口实现各种类型的计算。


由于目前存在着多种GPU版本的NVIDIA显卡,不同版本的GPU之间都有不同的差异,因此驱动部分基本上可以理解为是CUDA-enable的GPU的设备抽象层,提供硬件设备的抽象访问接口。CUDA提供运行期环境也是通过这一层来实现各种功能的。由于体系结构中硬件抽象层的存在,CUDA今后也有可能发展成为一个通用的GPU标准接口,兼容不同厂商的GPU产品。

640?wx_fmt=png

图3-1 CUDA处理流程


对于软件开发者来说,使用Cuda平台调用Cuda的加速库使用的语言包括:C、C++和Fortran。C/C++编程者使用UDAC/C++并用nvcc进行编译。


Nvidia的LLVM库是基于C/C++编译器的。Fortran的开发者能够使用CUDA Fortran,编译使用PGI CUDA Fortran。当然CUDA平台也支持其他的编程接口,包括OpenCL,微软的DirectCompute、OpenGL ComputeShaders和 C++ AMP。第三方的开发者也可以使用Python、Perl、Fortran、Java、Ruby、Lua、Haskell、R、MATLAB、IDL由曼赛马提亚原生支持。


3.2、OpenCL

OpenCL全称Open Computing Language即开放计算语言。OpenCL为异构平台提供了一个编写程序,尤其是并行程序的开放的框架标准。OpenCL所支持的异构平台可由多核CPU、GPU或其他类型的处理器组成。

 

CUDA只能够在NVIDIA的GPU硬件上运行。但是,OpenCL的目标是面向任何一种并行处理器,OpenCL是第一种真正的开放自由版权编程标准,适用于异构系统上的通用计算。而异构平台可由CPU、GPU、DSP、FPGA或其他类型的处理器搭建。

 

OpenCL程序同CUDA程序一样,也是分为两部分,一是用于编写内核程序(在OpenCL设备上运行的代码) 的语言,二是定义并控制平台的API。OpenCL提供了基于任务和基于数据两种并行计算机制,它极大地扩展了GPU 的应用范围,使之不再局限于图形领域。


OpenCL由Khronos Group维护。Khronos Group是一个非盈利性技术组织,维护着多个开放的工业标准,例如OpenGL和OpenAL。这两个标准分别用于三维图形和计算机音频方面。OpenCL源程序既可以在多核CPU上也可以在GPU上编译执行,这大大提高了代码的性能和可移植性。OpenCL标准由相应的标准委员会制订,委员会的成员来自业界各个重要厂商。作为用户和程序员期待已久的东西,OpenCL带来两个重要变化:一个跨厂商的非专有软件解决方案;一个跨平台的异构框架以同时发挥系统中所有计算单元的能力。

 

OpenCL是一个用于异构平台上编程的开放性行业标准。这个平台可以包括 CPU GPU和其他各类计算设备,OpenCL会将各类计算设备组织成一个统一的平台。OpenCL不仅仅是一种编程语言,更是一个完整的并行编程框架,它包括编程语言,API,函数库以及运行时系统来支持软件在整个平台上的开发。


640?wx_fmt=jpeg
全球敏捷运维峰会限时票务优惠



温馨提示:

请识别二维码关注公众号,点击原文链接获取更多云计算、微服务等技术资料总结

640?wx_fmt=jpeg

640?wx_fmt=gif&wxfrom=5&wx_lazy=1

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

最全GPU架构知识介绍 的相关文章

  • 监控显卡使用情况[关闭]

    Closed 这个问题是与编程或软件开发无关 help closed questions 目前不接受答案 当我运行某个应用程序时 如何监控显卡的使用情况 我想查看我的应用程序使用 GPU 的情况 如果您在 Visual Studio 201
  • Linux 上的 OpenCL,集成英特尔图形芯片

    我想用OpenCL在 Debian 8 上 我读到在本页 http streamcomputing eu blog 2011 12 29 opencl hardware support Linux 上不支持 Intel 的 GPU 这篇文章
  • 为什么 nvidia-smi 在 Windows 10 21H2 下的 WSL2 中返回“GPU 访问被操作系统阻止”[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 在 WSL2 上安装 CUDA 我已按照以下说明在台式机 配备 RTX3080 的 AMD 5950X 系统 和笔记本电脑 配备 i7 7
  • 如何使用 eclipse Nsight 仅使用一个 GPU 调试 CUDA

    我收到错误 所有 cuda 设备均用于显示 在调试时无法使用 使用Ubuntu 有没有什么方法可以使用 Nsight eclipse 仅使用一个 GPU 进行调试 我见过类似的解决方案 sudo 服务 lightdm 停止 杀死 X 但这也
  • Keras 不在具有 python 3.5 和 Tensorflow 1.4 的 Pycharm 上使用 GPU [重复]

    这个问题在这里已经有答案了 from tensorflow python client import device lib def get available gpus local device protos device lib list
  • 在 Tensorflow 中训练简单模型 GPU 比 CPU 慢

    我在 Tensorflow 中设置了一个简单的线性回归问题 并在 1 13 1 中使用 Tensorflow CPU 和 GPU 创建了简单的 conda 环境 在 NVIDIA Quadro P600 的后端使用 CUDA 10 0 然而
  • 使用 pytorch 获取可用 GPU 内存总量

    我正在使用 google colab 免费 Gpu 进行实验 并想知道有多少 GPU 内存可供使用 torch cuda memory allocated 返回当前占用的 GPU 内存 但我们如何使用 PyTorch 确定总可用内存 PyT
  • Ubuntu 11.10/12.04 上的 CUDA“无兼容设备”错误

    一段时间以来 我一直在尝试在我的笔记本电脑上设置 Ubuntu 环境来进行 CUDA 编程 我目前双启动 Windows 8 和 Ubuntu 12 04 并想在 Ubuntu 上安装 CUDA 5 该笔记本电脑配有 GeForce GT
  • cuda中的count3非常慢

    我在 CUDA 中编写了一个小程序 用于计算 C 数组中有多少个 3 并打印它们 include
  • 某些子网格未使用 CUDA 动态并行执行

    我正在尝试 CUDA 5 0 GTK 110 中的新动态并行功能 我遇到了一个奇怪的行为 即我的程序没有返回某些配置的预期结果 不仅是意外的 而且每次启动都会出现不同的结果 现在我想我找到了问题的根源 似乎当生成太多子网格时 某些子网格 由
  • OpenCV GPU Farneback 光流在多线程中表现不佳

    我的应用程序使用 Opencv GPU 类gpu FarnebackOpticalFlow计算输入视频的一对连续帧之间的光流 为了加速该过程 我利用 OpenCV 的 TBB 支持在多线程中运行该方法 然而 多线程性能并不像单线程那样 为了
  • CUDA Visual Studio 2010 Express 构建错误

    我正在尝试在 64 位 Windows 7 上使用 Visual Studio 2010 Express 在 Windows 上开始 CUDA 编程 我花了一段时间来设置环境 然后我刚刚编写了我的第一个程序 helloWorld cu 目前
  • “分页文件太小,无法完成此操作”尝试训练 YOLOv5 对象检测模型时出错

    我有大约 50000 个图像和注释文件用于训练 YOLOv5 对象检测模型 我在另一台计算机上仅使用 CPU 训练模型没有问题 但需要太长时间 因此我需要 GPU 训练 我的问题是 当我尝试使用 GPU 进行训练时 我不断收到此错误 OSE
  • 如何在GPU支持下运行python代码

    我创建了一个 Flask 服务 用于接受以相机 URL 作为参数的请求 用于在相机框架中查找对象 桌子 椅子等 我已经在 Flask 中编写了用于接受 POST 请求的代码 app route rest detectObjects meth
  • UnimplementedError:图形执行错误:在张量流上运行 nn

    我一直遇到这个错误 我不知道为什么 特别是因为我完全遵循某人的代码并且该人在运行此错误时没有错误 img shape 128 128 3 load pretrained model base model tf keras applicati
  • 设备内存刷新cuda

    我正在运行一个 C 程序 其中调用了两次 cuda 主机函数 我想清理这两个调用之间的设备内存 有没有办法可以刷新 GPU 设备内存 我使用的是计算能力为2 0的Tesla M2050 如果你只想将内存归零 那么cudaMemset可能是最
  • 如何检查 webgl(two.js) 的客户端性能

    我有一个使用 Three JS 的图形项目 现在我想自动检查客户端 GPU 性能并计算可以在应用程序中加载多少元素 我想到了诸如 GPU 基准测试之类的东西 看一眼stats js https github com mrdoob stats
  • 完全禁用 NVCC 优化

    我正在尝试测量 GPU 上的峰值单精度触发器 为此我正在修改 PTX 文件以在寄存器上执行连续的 MAD 指令 不幸的是 编译器正在删除所有代码 因为它实际上没有做任何有用的事情 因为我没有执行任何数据的加载 存储 是否有编译器标志或编译指
  • 需要 TensorFlow 依赖项。如何在 Windows 上运行 TensorFlow

    我有兴趣让 TensorFlow 在 Windows 上运行 但目前我意识到这是不可能的 因为某些依赖项无法在 Windows 上使用 例如巴泽尔 之所以出现这种需求 是因为据我目前了解 从 TensorFlow 访问 GPU 的唯一方法是
  • 如何使用Slurm访问集群中不同节点上的GPU?

    我可以访问由 Slurm 运行的集群 其中每个节点都有 4 个 GPU 我有一个需要 8 个 GPU 的代码 那么问题是 如何在每个节点只有 4 个 GPU 的集群上请求 8 个 GPU 这就是我尝试通过以下方式提交的工作sbatch bi

随机推荐

  • 检查pytorch是否安装成功、查看torch和cuda的版本

    方式 1 在安装完成pytorch和cudatoolkit之后 xff0c 需要检查一下是否安装成功 xff0c 可以直接查看当前环境下安装的所有包来验证 xff1a conda list 可以看到pytorch版本和cuda的版本分别是1
  • 【工具】向日葵远程控制之后键盘失效、自动锁定按住Alt键

    在使用向日葵软件远程控制过别人的电脑后 xff0c 偶尔会出现一个BUG xff0c 就是自己键盘的ALT自动锁定了 xff0c 好像始终按着ALT键不放 xff0c 导致键盘无法使用 主要原因就是 xff0c 在远程控制时 xff0c 使
  • 上采样和反卷积 Up-sampling and Transposed Convolution (Deconvolution)

    文章目录 1 卷积操作2 卷积矩阵3 反卷积4 反卷积矩阵5 使用卷积计算反卷积6 总结参考文献 使用反卷积 xff08 Transposed Convolution xff09 来进行上采样操作 xff0c 不需要借助插值方法 xff0c
  • 【Python】执行python脚本命令,向argparse传参时出现 error: unrecognized arguments: True 错误

    错误 在使用python脚本命令 xff0c 向argparse传递参数时 xff0c 报了下面的错误 xff1a error ununrecognized arguments True 脚本命令及argparse代码如下 xff08 为了
  • 【工具】Typora 自定义快捷键

    在软件中打开官方教程 依次点击 xff1a 文件 gt 偏好设置 点击 偏好设置 gt 通用 gt 自定义快捷键 会打开官方对于修改快捷键的说明文档 xff1a https support typora io Shortcut Keys c
  • JSONArray 删除元素(JSONObject删除元素JSONObject)

    span class token class name JSONObject span o1 span class token operator 61 span span class token keyword new span span
  • Android入门 初探Databinding的使用

    使用数据绑定库DataBinding实现篮球计分功能 参考资源 Android开发教程 xff08 2019最新版 使用JetPack xff09 数据绑定库是一种支持库 xff0c 借助该库 xff0c 您可以使用声明性格式 xff08
  • Java多线程之生产消费模型

    生产消费模型 所谓生产消费模型 xff0c 是通过一个容器来解决生产者和消费者的强耦合问题 通俗的讲 xff0c 就是生产者不断的生产 xff0c 消费之也在不断消费 xff0c 消费者消费的产品是生产者生产的 xff0c 这就必然存在一个
  • 阿里中台(看图不说话)

    阿里中台战略 xff0c 源于阿里高管15年中参观世位于芬兰界上最成功的移动游戏公司Supercell Supercell的核心竞争力就在多年的游戏研发中积累了非常科学的研发方法和体系 xff0c 包括游戏开发过程中公共 通用的游戏开发素材
  • Android Studio3.5下创建的BottomNavigationView项目无法使用NoActionBar的处理

    在使用Android Studio3 5下创建的BottomNavigationView项目时因为BottomNavigationView使用fragment控件的NavHostFragment进行Fragment切换 xff0c 但却无法
  • SQL Server like 的简单用法解释 模糊查询

    一 问题或解决方法应用场景 使用SQL Server 查询时 xff0c 经常会使用模糊查询 xff0c 需要查询包含的指定字符串内容 下面的内容 xff0c 我简单总结下 xff0c like 的常用方式 xff08 电脑没法发图片 xf
  • Java的生产者消费者模型

    前言 学完了线程后 xff0c 我又去找了一些线程相关的练习题来练手 xff0c 其中印象最深的就是生产者消费者模型这一块 xff0c 为什么呢 xff0c 因为它每一篇练习题里都有 xff0c 开始没看懂 xff0c 后面就去仔细研究了一
  • IDEA创建vue项目及vue项目中路由的配置

    首先参考了这篇文章用idea创建了vue项目 然后我想直接加 login就访问到我新建的Login vue文件 xff0c 发现不行 xff08 小白有点天真了 xff09 得知需要配置路由才能这样访问到 xff0c 但配置的过程到处碰壁
  • KBQA知识问答概述

    问答系统历史 xff1a 基于模板的问答专家系统 gt 基于信息检索的问答 gt 基于社区的问答 gt 基于知识库的问答 xff08 受益于维基百科等 xff09 问答形式分类 xff1a 一问一答 xff0c 交互式问答 xff0c 阅读
  • 2021-10-15Ubuntu开机进入tty1,无法进入图形界面

    1 tty1界面输入账号密码 2 输入指令 xff1a sudo apt install ubuntu desktop 3 重启 xff1a reboot
  • 进程互斥、同步--多生产者多消费者问题

    1 问题描述 xff1a 有一个缓冲区 xff0c 生产者1和生产者2分别生产产品1和产品2 xff0c 消费者1和消费者2分别消费产品1和产品2 只有当缓冲区空时 xff0c 生产者才可以向缓冲区生产产品 当缓冲区不空时消费者1或者2才可
  • 剑指 Offer 03. 数组中重复的数字

    https leetcode cn com problems shu zu zhong zhong fu de shu zi lcof span class token keyword class span span class token
  • VScode连接服务器+SFTP同步文件

    VScode连接服务器 43 SFTP同步文件 1 VScode远程连接服务器2 Vscode本地与远程文件同步 1 VScode远程连接服务器 应用商店安装remote development 此时会自动安装其他的 xff08 Remot
  • MyBatis和MyBatisPlus关系

    MyBatis和MyBatis Plus都是用来操作数据库的框架 MyBatis是一个持久层框架 xff0c 它的核心功能是将Java程序中的对象映射到数据库表中 MyBatis Plus是在MyBatis的基础上进行了封装和增强 xff0
  • 最全GPU架构知识介绍

    1 GPU的起源 GPU缩写为Graphics Processing Unit的 xff0c 一般称为视觉处理单元 GPU被广泛用于嵌入式系统 移动电话 个人电脑 工作站和电子游戏解决方案当中 现代的GPU对图像和图形处理是十分高效率的 x