一、概念
1. CPU?
CPU 全称 Central Processing Unit,中文名为中央处理器,是计算机中的重要组成部分。计算机中的操作都属于计算,而 CPU 就是处理这些计算,并生成对应结果的工具,相当于是计算机的大脑。
2. GPU?
GPU 全称 Graphics Processing Unit,中文名为图形处理器,也是计算机中的重要组成部分,也负责处理计算机中的一些计算。所属层级为芯片。
3. 显卡?
显卡与 GPU 并不划等号,显卡是一个集成单元,是以 GPU 为中心、包含显存、供电、散热、输出接口等组件的完整硬件设备。
- 核显:全称核心显卡,是指带有 GPU 的 CPU 核心处理器,是在物理层面确实存在的,老计算机都是核显。
- 集显:全称集成显卡,是一个统称,一个抽象的概念,将 GPU 集成在 CPU 中,这个称为集显,物理上不存在,逻辑上核显是集显的子集。
- 独显:全称独立显卡,是一个完整的硬件设备,也是物理层面上存在的,即现在单独售卖的显卡,称为独显。
- 双显:现在计算机都是双显存在的。即既有集显也有独显,集显能够保证最基本的运行,而特定工作场景使用独显工作能够获得最优的效率。
二、CPU和GPU的区别?
1. 任务场景
两者都是用于计算,但对于不同任务的计算,两者所擅长的领域是不同的
- CPU:适合一些比较复杂的任务场景,比如逻辑层面,简单来说,CPU 比较万能,它什么都可以计算。
- GPU:适合一些简单但重复的计算场景,例如:我们都知道一个画面是由多个像素点构成的,那么假如要将所有的像素点值都相加 1。这样简单的操作,使用 GPU 就效率更高。
2. 运算效率
面对不同的任务场景,由 CPU 和 GPU 协助处理,效率是最高的。
- 简单来说,CPU 很厉害,它什么都可以做,包括 GPU 能干的,它也可以干。但是在不同的场景下,例如:对于一个 9*9 格子,要将里面的值都 +1,如果是 CPU 来计算的话,它也可以计算出来,但是可能是一格一格计算,效率并不高。而 GPU 就相当于同时同步计算,由于任务简单,没有复杂的逻辑,所以很快的就计算出了结果。
- 而若是每个格子里面计算是不同的,包含了逻辑单元,例如:如果这个格子是偶数就不计算,那么 CPU 在计算的时候就会判断这个格子,而 GPU 则无法处理这些复杂的逻辑单元。
- 通俗点的例子就是:CPU 就是博士,它可以写论文,也可以写出 1000 个九九乘法表,就是写的慢。但是 GPU 就相当于 1000 个小学生,你让它们写论文,写不出来,但你让它们写九九乘法表,每个小学生同时写,很快就写完了。这就是对同一任务,CPU 和 GPU 运行效率的不同。
3. 核数
- CPU:我们常在网上看到一个电脑 CPU 是 8 核、12 核等,这个核数就是 CPU 所拥有的处理单元。以前是单核,处理任务的时候,其它任务就只能等待。而多核就相当于,从原先一个人计算,变成了多个人计算。可以不同的人分配不同的计算任务,互相不影响。
- GPU:GPU 的核一般被称为 CUDA 核心。是具有相当庞大的数量的,拥有成千上万个核心,因此由于数量过多,对应的处理复杂任务的能力就弱,但是简单的任务就强。
- 因此在上一节中为什么以 1 个博士和 1000 个小学生做类比,因为 CPU 的核就相当于博士,GPU 的 CUDA 核心就相当于小学生。一个 CPU 的核数常见的就是 8、12、16核,相比于 GPU 所用的核心数是相当少的。但是从处理能力上,CPU 能够处理非常复杂的任务,而 GPU 则无法处理,只能进行稍微简单的任务。
4. 运行机制
虽然 CPU 核 GPU 都是并行的,但是侧重点不同
- CPU 专注与少而精的操作,让它计算 1+1 也可以运算,但无异于 “大炮打蚊子”。
- GPU 专注与多而简的操作,能够让多个核心统一进行相同的操作,适合数量庞大但简单的运算。
5. 协同?
在实际的场景中,是由 CPU 和 GPU 协同操作的,CPU 负责处理复杂的场景,而这复杂场景中大量重复且统一的任务就交给GPU 运行,就能达到最大的效率。
三、为什么大型游戏、深度学习更依赖于 GPU?
大型游戏主要是实时渲染的问题,画面呈现是由大量的像素点组成的,而对于色彩的计算相对简单,因此大量像素点色彩切换的计算交给 GPU 就更为合适。而深度学习主要是矩阵运算,也是重复且单一的操作,且需要大量数据做支撑,就更适合使用 GPU。
四、知识拓展(进程、线程)?
进程通俗可以理解为一个正在运行中的程序,而线程是这个进程中的一部分。例如打开微信聊天的时候,微信就占用了一个进程,但是处理发送和接受的时候就是占用的一个线程,因此一个进程中至少有一个线程,但可以有多个线程。
- 进程之间的隔离性强,一个进程的崩溃不会影响其余进程,例如微信的崩溃不会影响 QQ 的运行。
- 线程的隔离性较差,一个线程的崩溃,可能会影响到整个进程,例如如果负责发送消息的进程崩掉,那么整个微信就无法进行聊天,甚至有可能直接崩溃。