为什么大家都用 GPU “画框框” ?

最近突然联想到 ” 为什么研究 CV 时大家都使用 GPU 而非 CPU?”,鉴于笔者并非 CV 方向,却又对这个问题十分好奇,故上网搜索若干资料,并杜撰这篇文章做下记录,顺便回顾有关 CPU,GPU 的基本知识,发展过程等。

首先,CPU 和 GPU 是负责完成不同任务的不同器件,两者并非 “排斥” 的替换关系 —— 在老式电脑中,可以没有单独的 GPU ,但是绝不可能没有 CPU。

全文主要参考自:

CPU 和 GPU 的区别是什么? – 知乎 (zhihu.com)

黄大大的奋 (ji) 斗 (tang) 历史:

创业28年,牛逼吹了28年,他,终于干翻英特尔还领先了一个身位! – 知乎 (zhihu.com)

CPU

在标准的冯诺依曼架构当中,计算机由五个部件构成:输入设备,存储器,运算器,控制器,输出设备。其中,粗体标注的两样就是 CPU 所负责的部分。因为物理构造,器件间的物理距离,工作机制等方面的差异,CPU 的处理速度和内存严重不匹配 ( 为什么寄存器比内存快? – 阮一峰的网络日志 (ruanyifeng.com) )。为了减少频繁访问 “慢” 的内存导致效率变慢的问题,CPU 做了两件事:

  1. 设有寄存器,和运算器,控制器这两者一同构成 CPU 的核心部件。根据寄存的内容不同,寄存器的类别也五花八门:存储器地址寄存器 MAR,存储器数据寄存器 MDR,( 当前 ) 指令寄存器 IR,程序计数器 PC。
  2. 分摊出较大一部分空间作为缓存 Cache,并遵从这样一个原则:能去寄存器取值就不去缓存,能去缓存取值就绝对不去内存。

cpu_inst.jpg

CPU 的频率实际上分为主频和外频,外频就是专门为了 “迁就” 慢部件的,我们通常讨论的 CPU 频率则指主频

主频 = 外频 × 倍频。由于主频远大于外频,因此倍频在此充当了一个 “调和系数” 。我们可以通过一些官方软件,或者进入 Basic I/O System,BIOS 系统 ( 电脑开机时用于启动 OS Kernel 的 Bootstrap 程序,还负责开机前检查硬件并调整机器参数,这些设置可直接烧录在 COMS 芯片上 ) 内通过调整倍频的方式来提高 CPU 主频。主频超过额定系数,CPU 将处于 “超频” 的状态,这是以牺牲使用寿命和更高的损坏风险为代价的。

CPU 的工作过程大体上可以分为三步:取指令,分析,执行。比如当涉及 “1 + 1” 的问题计算时,CPU 的控制器 CU 通过分析指令获悉应去哪里取值 ( 这些值应当提前通过总线保存到 CPU 内的寄存器当中了。如果 CPU 要从内存读取数据,那么得通过 MMU 单元,经历地址虚实转换等一系列过程完成 ),如何做,算好的值又应该存到哪里,然后控制器 CU 再将具体的计算步骤下放给 ALS 运行。

我们用高级语言编写的程序,都需要向下一步步最终转换机器语言,即二进制,n 字节表示的 CPU 指令。CPU 大体上遵从顺序执行 ( 出于优化的目的,现代 CPU 会对某些指令进行重排序,因此实际上 CPU 并不是严格顺序执行的 )。简单地说,如果一个 1 核 CPU 计算一道 “1 + 1” 的问题需要 n 时间,那么计算 1000 道 “1 + 1” 大致要花费 1000n 的时间。

作为计算机的 “一家之主”,CPU 负责的家务活远比想象中的要多,内部构造也非常复杂。当今,一个物理 CPU 芯片可有多个处理核心,比如有 4 个处理核心的芯片我们可以简称它是 “4 核芯片”。同时,由于超线程技术的发展,一个核心在一个时间片内,在逻辑上可以并发地处理两到多个线程。比如说,笔者当前的电脑就是 “4 核 8 线程” 的 CPU 配置 ( Windows 系统中可以打开资源管理器查看 ),当然,硬说它是 “8 核芯片” 也勉强没有大问题,但是 “4 核 8 线程” 和 “8 核 8 线程” ( 后者不使用超线程技术 ) 在 CPU 利用率几近占满的情况下效率会存在较大差别,前者将明显低于后者。

cpu_info.png

CPU 将大部分的精力投入到了控制 ( 如指令跳转 ) 和管理 Cache ( CPU 对此还划分出了三级缓存 ) 两件事上,而运算相比之下只是一小部分。CPU 内部,其 CU,Cache,ALS 三大单元的比率大致为 1:2:1,即运算其实只占了 CPU 25% 的部分。当然,这并不是在说 CPU 的运算能力不强,相反,大部分 CPU 基本都可以在极少的时钟周期内完成复杂的浮点数运算。

CPU 发达的运算能力和更发达的控制能力使其在处理存在复杂指令流的程序时得心应手。但反过来想,如果 CPU 总是处理一些简单,重复的计算任务,甚至说这种任务是超大量的,那么就有点太 “屈才” 了。这为后续显卡的发展以及 GPU 的诞生埋下了伏笔。

GPU 的前生 —— 显卡

1962 年,电脑图形学由麻省理工学院的 Ivan Edward Sutherland 提出,并在之后的二十年不断发展。不过,那时没有专业负责图形处理的元件,人们也没有提出 “GPU” 的概念,在电脑中输出图形的工作仍然是由 CPU 来负责。

对于计算机来说,图形就是一个矩阵,矩阵的每一个元素代表了对应像素位置上的颜色号。那么处理图像就是对矩阵内的每一个像素进行同样的计算处理,并最终合并得到整体的计算结果。很显然,对每一个像素的处理都是独立的 ( 计算当前像素不会影响到其它像素的计算结果 ),这意味着图像计算非常适用于拿去并行计算。依据这个原理,适合做并行计算的还有密码破译,挖币等 “行业”。

但以当时的技术来看,并行计算很难,也没有图形加速等技术。那时电脑处理图像的过程和 CRT 显示器似乎没有什么区别 —— 依赖 CPU 顺序地 “扫描” 并计算图形的每一个像素并输出,在当时,”显卡’ 还叫 VGA Card ( 中文名:图形适配器 ) ,它的任务仅是将 CPU 计算好的图形翻译成显示设备能识别的信号并投射到显示屏,自身没有计算能力 ( 这是后文 GPU 干的活 )。

在 1988 年,ATI 公司生产的支持显示 256 种颜色的 ATI VGA Wonder 显卡问世,是第一款真正意义的第一代显卡。后续显卡的发展主要体现在像素精度的提高,或是颜色种类的拓展等方面。可毕竟 VGA 仅负责图像的输出,而图像的计算任务仍然由 CPU 全盘负责,尤其是 90 年代微软推出支持视窗操作的 Windows 图形操作系统之后,孤军奋战的 CPU 逐渐 “不堪重负”。

在 1991 年,ATI 公司 Mach 8 显卡的发布,意味着第一款支持微软视窗操作的第二代显卡 ( Graphics Card ,图形加速卡,也是 “显卡” 的真名 ) 问世。其内置了专用的芯片 ( 它就是 GPU 的雏形,但是当时还是个无名小卒 ) 负责进行图形加速,大幅度解放了 CPU 的生产力。该显卡的诞生加速了视窗的普及,也加速了 PC 端图形化界面发展的步伐。

在多媒体时代,支持视频加速的第三代显卡,以及支持三维加速的第四代显卡也陆续面世。显卡行业经过十年血战,80 家厂商灰飞烟灭,整个行业进入 N 卡 ( NVIDIA ) 和 A 卡 ( AMD ) 两强争霸的时代。在 1999 年,”GPU” 的概念正式被 Nvidia 公司提出,并推出了第一款 GPU —— GeForce 256。

What’s GPU

GPU,全名 Graphics Processing Unit,是安装于显卡内的芯片 ( 网上大部分人习惯将 GPU 与 “显卡” 两个事物等同起来,没有大毛病,但不完全正确 )。故名思义,在最开始,GPU 的任务就是替 CPU 分担图形渲染,图形加速等任务,而这些任务又需要大量的并行运算,因此 GPU 的架构也是在此基础上量身打造的。

和 CPU 相比,GPU 内部有近 90% 都是由 ALS 组成,而 Cache,CU 只占了剩下的一小部分,因此 GPU 非常适用在前后计算步骤无依赖性,相互独立的计算场景。如果将 GPU 和 CPU 单个计算单元 ALS 拿出来比较,GPU 无法与之相提并论 ( 这里笔者按频率来作大致衡量,GPU 的频率单位是 MHz,而 CPU 的频率则是 GHz,几乎差了 103 个数量级 ),但 GPU 胜在 “人海战术” —— 一个 CPU 可能仅有几个 ALS ,但是 GPU 的 ALS 可能有上千上万个,其中每一小簇 ALS 以一个单位构建成一个计算流水线 Pipeline 。

gpu_inst.jpg

网上有一个非常流行的比喻:CPU 是一个老教授,GPU 则领着 1000 个小学生。如果要解决 1000 道小学算术题,很显然 GPU 更快。如果要解决复杂推理的数学问题,无论是多少个小学生都无济于事,还得需要具有强大的控制和运算能力的教授来行。比如 1000 道 “1 + 1” 的问题分别给 GPU 和 CPU 完成,CPU 可能需要 1000n 的单位时间,但是 GPU 可能只需要 m 个单位时间内就能解决。但如果让它们各自解同一道高数题,情况就完全反过来了。

据笔者一位研究 CV 的朋友所述,相同的训练工作,只用 CPU 完成需要约六天,但使用 GPU 却只需要两天。

年轻人的下一款显卡,何必拿来玩游戏

我们现在所提到的显卡,一般指加装于台式机上的,拥有两三片巨大散热风扇的独立显卡。以至于后续更加魔幻的现实走向,就是利用显卡炒币带动显卡价格飞涨,从而导致 CV 方向的研究er 和各路游戏发烧友叫苦不迭等云云了。

之后的故事,就是那位华人猛男,Nvidia 的创始人 —— 黄仁勋的主场。起初, Nvidia 只是想为全球游戏玩家打造最好的 3D 图形芯片。但慢慢地,黄仁勋发现,科学家也用 GPU 来加速计算。

huang.jpg

2012 年,吴恩达领衔谷歌大脑,从 1000 万张图片中,成功识别出一只猫,震惊业界。但耗资 100 万美元,集结 1000 台电脑、16000 个 CPU 的投入,却令他崩溃。直到终于有一天,吴恩达首开先河,用 Nvidia 的图形处理芯片(GPU)代替英特尔的 CPU,构建了一个深度学习模型。这一次,他只用 16 台电脑、64 个 GPU 就搞定了同样的事情。这个足以让吴恩达感到兴奋的结果,背后是一场深刻的计算革命。

自从 1978 年英特尔开创 x86 架构以来,CPU 便一统计算江湖,但这种擅长逻辑运算的处理器,对大吞吐量数据却很吃力。于是,当数据大爆炸和人工智能出现后,GPU 凭借着强大的并行计算能力,大有后发之势。GPU 的受众也从一开始的游戏爱好者逐渐拓展到科研部门 ( 听着很神奇 )。不过有一点从未改变:那就是 CPU 作主 ( host ) 而 GPU 是从 ( device ),在未来,无论 GPU 发展得多快,都只能是替 CPU 分担工作,而不是取代 CPU。

不过在早时,对 GPU 编程是一件很痛苦的事,很多通用计算甚至还需要借助图形计算的 API 完成 “曲线救国”。为了打开这个市场,黄仁勋做了一个关键性的赌注。他任命大卫·柯克为首席科学家,秘密启动了一个叫 CUDA 的项目,旨在打造一个通用的并行计算架构,让 N 卡不仅仅只是图形处理芯片。 CUDA 全称为 Compute Unified Device Architecture,中文名统一计算设备架构,是它真正赋予了 N 卡在除了在游戏领域以外的,可用于面向并行计算编程的特性。

现在,CUDA 几乎成为了事实上研究 CV 或其它深度学习等方向所必备的标准库之一,降低了广大研究er 的科研门槛,使其解脱于复杂的硬件调参而专心投入到算法优化上,GPU 在人工智能领域 ( 和挖币 ) 的巨大潜力也正逐渐被大家所认知,挖掘。

其它参考链接

【笔记】CPU的结构和功能(一)_time-space的博客-CSDN博客_cpu结构

【笔记】CPU的结构和功能(二)_time-space的博客-CSDN博客_cpu的结构和功能

关于CPU的一些基本知识总结 – 骏马金龙 – 博客园 (cnblogs.com)

CPU是如何访问内存的? – 知乎 (zhihu.com)

OpenCL与CUDA,CPU与GPU_Bin 的专栏-CSDN博客_opencl和cuda渲染速度

CPU和GPU到底有什么区别? – 知乎 (zhihu.com)

CUDA和OpenCL有什么区别? – 知乎 (zhihu.com)

CPU和GPU,谁才是小学生? – 知乎 (zhihu.com)

什么是GPU?跟CPU有什么区别?终于有人讲明白了 – 知乎 (zhihu.com)

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享