GPU的工作原理

location: Beijing

1. why is GPU

CPU的存储单元和计算单元的互通过慢直接促进了GPU的发展
先介绍一个概念:FLOPS(Floating Point Operations Per Second,浮点运算每秒)是一个衡量其执行浮点运算的能力,可以作为计算机性能的指标。所以人们买计算机是往往关心一下计算机有多少FLOPS
然而,计算机性能可能是过剩的?下图是CPU与DRAM的关系
在这里插入图片描述

Fig. 1.1 计算机存算架构

DRAM每秒把200GB的数据,也就是把25,000,000,000个FP64类型的浮点数传输给CPU;CPU每秒可以计算2,000,000,000,000个FP64类型的浮点数。可以看出,CPU可处理数据的能力是DRAM传输能力的80倍(这种比值有个专业术语:计算强度),除非我们的程序对每个数据都做80次运算,否则CPU的算力总是过剩的

所以从这里可以看出,大部分时间,计算机运行程序的速度并不取决于CPU的计算能力,而是DRAM与CPU传输数据的时间延迟(latency)

以一段测试程序daxpy函数为例:
在这里插入图片描述

Fig. 1.2 存取速度测试程序

这里我们默认alpha存在CPU的缓存中,数组x和y存在DRAM中。当程序执行时,我们用甘特图看看程序的执行:
在这里插入图片描述

Fig. 1.3 程序运行甘特图

可以看出,在程序运行的过程中,CPU花了大量的时间在等待DRAM把数据传过来,这段等待时间大概是占整个程序执行时间的99%以上
至于为什么这么慢,我们可以理解为光速太慢,CPU尺寸太大,传输线太长……anyway,这里不在追究,不过值得一提的是,NVIDIA、Intel、AMD都无法解决这个物理问题
这个问题没办法解决了吗?或许我们可以另辟蹊径,既然这种latency无法避免,那我们就想办法“掩盖”这个latecy
如果总线在89ns内可以传输11659bytes数据,通过daxpy函数可以看到这个函数89ns内只要了16bytes的数据,所以为了让总线忙起来,我们只需要让daxpy函数一次要11659/16=729次数据就能让总线满负荷
比如下面一段程序一定程度上让总线忙一点
在这里插入图片描述

Fig. 1.4 高并发

通过这种一次加载大量数据,让CPU和DRAM之间的传输线忙起来,这从一定程度上“减少”了后面加载的数据的延迟,使程序快速运行 ,理论上来讲,即使这是单线程的程序,我的循环中迭代729次也是没问题的

这里需要指出一个点:并行性指的是计算机同时处理多个任务的能力,在硬件限制下每个线程同时处理一个操作,但硬件可以处理很多线程;并发性指计算机有处理多个任务的能力,不讲究同时。

这样通过多线程的模式,也可以掩盖latency的的事实。
在这里插入图片描述

Fig. 1.5 多线程支持

从这里可以看出NVIDIA的优势,通过对一批数据进行221184种不同的操作(线程),来掩盖latency的不足,GPU就是为少量数据进行大量任务而设计的,与此相比,CPU期望通过一个线程解决所有问题。

因此,解决latency的问题变为:创造足够多的线程。

2. What is GPU

在这里插入图片描述

Fig. 2.1 GPU架构

其中,我们希望离SM较近的寄存器能够尽可能的填满,因为每向较远的缓存访问数据,latency都会灾难性的上升。每一个SM都是一个基础处理单元,下图使SM的示意图
在这里插入图片描述

Fig. 2.2 SM示意图

warp使GPU的基本调度单元,每个warp由32个线程组成,作用是将大量线程分组并同时执行,以实现并行计算和隐藏内存访问延迟,Warp中的32个线程将同时执行相同的指令,但操作不同的数据,但如果遇到条件分支语句(如if语句),不同线程可能会选择不同的执行路径。在这种情况下,Warp会以SIMD方式执行分支,即每个线程都会执行分支中的指令,但只有满足条件的线程会更新结果。
如果是单线程,那所有任务都要排队执行,而且最慢的任务可能卡着其他任务执行;但如果是多线程,所有任务都可以同时进入运算,这样就会更快,对延迟的处理更好。
但事实上,各线程之间很少能够独立的进行,因为很多算法或多或少需要一些邻居的数据,比如卷积操作,傅里叶变换。
在这里插入图片描述

Fig. 2.3 多线程支持

线程之间相互影响

3. How is GPU

在这里插入图片描述

Fig. 3.1 AI识别猫

比如我让AI去识别一只猫,首先先把照片切块,所有这些块相对独立的操作,GPU通过超量分配(oversubscribed)加载这些块,希望GPU的内存能够满载。然后每个块由若干线程同时操作,这些线程可以共享这个块的数据。

GPU的超量分配(Oversubscription)是指在GPU加速计算环境中,分配给应用程序或作业的资源超出了物理GPU硬件的实际容量,以覆盖latency。
在这里插入图片描述

Fig. 3.2 GPU图像识别

像这样,一个大的任务被分解成若干线程块,每个块相对独立,每个块都有同时进行的并行线程,这些并行的线程共享这个块的数据,当然特定块中的线程可以有所交叉。
在这里插入图片描述

Fig. 3.3 GPU任务拆解

不同类型问题类型的计算强度如下图,intensity Scales=compute Scales/data Scales

可以理解为,对于Element-wise问题,每增加到N个线程,多加载到N个数据,多N组运算;对local问题,每增加N到个线程,多加载NN个数据,多NN数量级次的运算,在卷积中再多的数据也没办法与算术强度相抗衡;但是对于All-to-All问题,每增加到N个线程,多加载N个数据,多了N*N次运算,算术强度就会增加N。
在这里插入图片描述

Fig. 3.4 算术强度

事实上,矩阵的乘法就是All-to-All问题,对于矩阵乘法,NN的矩阵相乘,有N行乘N列,再进行N次相加,所以compute Scales为O(NNN) ,访问内存的数量级是O(NN) ,因此算术强度是O(N) 。

下图的蓝线是矩阵计算的计算强度随矩阵规模增加的曲线,橘线是GPU的计算强度曲线,假设交点是50,计算机运算FP32的最佳位置也就是这个点。对于白线,100是双精度浮点数的最佳计算点。随着矩阵的增大,运算量变得更大,也就不太需要这么多的数据,所以内存也就变得更闲了。GPU中存在一些tensor cores,就是算力更强,这个点也就会上移一些。当内存用完,也就不需要增加算力了。
在这里插入图片描述

Fig. 3.5

于是对应于GPU的内部结构,也就有了下图
在这里插入图片描述

Fig. 3.6

当数据存在L1,可以计算32*32,当数据存在L2可以计算大一些,当数据存在HBM,就会达到400。计算小矩阵更高效。
reference
[1] NVIDIA 2021 GPU工作原理

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

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

相关文章

【MySQL】事务的特性和隔离级别

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; 给大家跳段街舞感谢支持&#xff01;ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ …

vue 应用测试(一) --- 介绍

vue 应用测试&#xff08;一&#xff09; ---介绍 前端测试简介组件测试Jest 测试框架简介其他测试框架 第一个测试避免误报如何组织测试代码 组件挂载Vue2 组件挂载的方式Vue3 的挂载方式vue-test-utils挂载选项 如何调试测试用例参考小结 前端测试简介 软件测试&#xff1a;…

[AIGC] Python的Range函数

Python的range()函数是一个内置函数&#xff0c;常常用于编程中生成数列。这个函数可以生成一个整数序列&#xff0c;这个序列通常用在循环中。 文章目录 基本用法详细用法注意事项 基本用法 range()函数的基本形式为 range(stop) —— 这将生成一个从0开始&#xff0c;到stop…

Docker_1.0

1.初识Docker 1.1.什么是Docker 微服务虽然具备各种各样的优势&#xff0c;但服务的拆分通用给部署带来了很大的麻烦。 - 分布式系统中&#xff0c;依赖的组件非常多&#xff0c;不同组件之间部署时往往会产生一些冲突。 - 在数百上千台服务中重复部署&#xff0c;环境不一…

Content type ‘application/x-www-form-urlencoded;charset=UTF-8‘ not supported

Content type application/x-www-form-urlencoded;charsetUTF-8 not supported 问题背景新增页面代码改造 问题背景 这里有一个需求&#xff0c;前端页面需要往后端传参&#xff0c;参数包括主表数据字段以及子表数据字段&#xff0c;由于主表与子表为一对多关系&#xff0c;在…

基于单片机的多功能智能小车设计

第一章 绪论 1.1 课题背景和意义 随着计算机、微电子、信息技术的快速发展,智能化技术的发展速度越来越快,智能化与人们生活的联系也越来越紧密,智能化是未来社会发展的必然趋势。智能小车实际上就是一个可以自由移动的智能机器人,比较适合在人们无法工作的地方工作,也可…

C++ 12 之 指针引用

c12指针引用.cpp #include <iostream>using namespace std;struct students12 {int age; };int main() {students12 stu;students12* p &stu; // 结构体指针students12* &pp p; // 结构体指针起别名pp->age 20;// (*pp).age 22;cout << "…

【CTF Web】CTFShow 探针泄露 Writeup(PHP+探针泄露+信息收集)

探针泄露 10 对于测试用的探针&#xff0c;使用完毕后要及时删除&#xff0c;可能会造成信息泄露 解法 查看网页源代码。 view-source:https://11170dfe-84c7-4fde-b1ca-5d1ec3dd7570.challenge.ctf.show/没有找到有用的信息。 用 dirsearch 扫描。 dirsearch -u https://1…

打造私密的通信工具,极空间搭建免费开源的电子邮件管理程序『Cypht』

打造私密的通信工具&#xff0c;极空间搭建免费开源的电子邮件管理程序『Cypht』 哈喽小伙伴门好&#xff0c;我是Stark-C~ 说起电子邮件大家都不陌生&#xff0c;哪怕是在当前微信或者QQ已经非常普遍的今天&#xff0c;电子邮件在我们很多人的工作中都充当了重要的通信工具。…

【TB作品】基于STM32单片机的实验室器材管理登记二维码系统

这个单片机代码实现了一个实验室管理系统&#xff0c;该系统的主要功能包括记录和管理ID信息、日期和时间、以及显示这些信息到OLED屏幕上。以下是对代码主要功能的分析&#xff1a; 全局变量定义 定义了多个全局变量来存储系统状态、页面、密码、ID列表等信息。time 结构体用…

专题六——模拟

目录 一替换所有的问号 二提莫攻击 三N字形变换 四外观数列 五数青蛙 一替换所有的问号 oj链接&#xff1a;替换所有的问号 思路&#xff1a;简单模拟&#xff1b;注意i0和in是处理越界问题就行&#xff01;&#xff01; class Solution { public:string modifyString…

docker容器基本原理简介

一、docker容器实例运行的在linux上是一个进程 1&#xff09;、我们通过docker run 通过镜像运行启动的在linux上其实是一个进程&#xff0c;例如我们通过命令运行一个redis&#xff1a; docker run -d --name myredis redis2&#xff09;、可以看到首先我们本地还没有redis镜…

【LeetCode最详尽解答】11-盛最多水的容器 Container-With-Most-Water

欢迎收藏Star我的Machine Learning Blog:https://github.com/purepisces/Wenqing-Machine_Learning_Blog。如果收藏star, 有问题可以随时与我交流, 谢谢大家&#xff01; 链接&#xff1a; 11-盛最多水的容器 直觉 这个问题可以通过可视化图表来理解和解决。 通过图形化这个…

「动态规划」如何求乘积最大子数组?

152. 乘积最大子数组https://leetcode.cn/problems/maximum-product-subarray/description/ 给你一个整数数组nums&#xff0c;请你找出数组中乘积最大的非空连续子数组&#xff08;该子数组中至少包含一个数字&#xff09;&#xff0c;并返回该子数组所对应的乘积。测试用例的…

【数据结构】初识集合深入剖析顺序表(Arraylist)

【数据结构】初识集合&深入剖析顺序表&#xff08;Arraylist&#xff09; 集合体系结构集合的遍历迭代器增强for遍历lambda表达式 List接口中的增删查改List的5种遍历ArrayList详解ArrayList的创建ArrayList的增删查改ArrayList的遍历ArrayList的底层原理 &#x1f680;所属…

【全栈实战】大模型自学:从入门到实战打怪升级,20W字总结(一)

&#x1f60a;你好&#xff0c;我是小航&#xff0c;一个正在变秃、变强的文艺倾年。 &#x1f514;本栏讲解【全栈实战】大模型自学&#xff1a;从入门到实战打怪升级。 &#x1f514;专栏持续更新&#xff0c;适合人群&#xff1a;本科生、研究生、大模型爱好者&#xff0c;期…

JVM-GC-什么是垃圾

JVM-GC-什么是垃圾 前言 所谓垃圾其实是指&#xff0c;内存中没用的数据&#xff1b;没有任何引用指向这块内存&#xff0c;或者没有任何指针指向这块内存。没有的数据应该被清除&#xff0c;垃圾的处理其实是内存管理问题。 JVM虽然不直接遵循冯诺依曼计算机体系架构&#…

基于flask的网站如何使用https加密通信-问题记录

文章目录 项目场景&#xff1a;问题1问题描述原因分析解决步骤解决方案 问题2问题描述原因分析解决方案 参考文章 项目场景&#xff1a; 项目场景&#xff1a;基于flask的网站使用https加密通信一文中遇到的问题记录 问题1 问题描述 使用下面的命令生成自签名的SSL/TLS证书和…

Docker镜像技术剖析

目录 1、概述1.1 什么是镜像&#xff1f;1.2 联合文件系统UnionFS1.3 bootfs和rootfs1.4 镜像结构1.5 镜像的主要技术特点1.5.1 镜像分层技术1.5.2 写时复制(copy-on-write)策略1.5.3 内容寻址存储(content-addressable storage)机制1.5.4 联合挂载(union mount)技术 2.机制原理…

用PHP来调用API给自己定制一个“每日新闻”

头条新闻汇聚了互联网上的时事动态&#xff0c;提供最新新闻动态、网络热门话题和视频更新等&#xff0c;覆盖社会、政治、体育、经济、娱乐、科技等多个领域&#xff0c;并不断刷新内容。企业应用这一接口后&#xff0c;可以快速吸引更多的用户访问自己的平台。即使是非新闻类…