区别是CPU最多也就十几个核心

GPU动辄几百上千个核心

更别说CPU核心指令集更全面 GPU核心基本只有SIMD指令(因为GPU主要是用于图形处理 向量运算远比标量运算多 并且对CPU来说多一套指令运算单元 就是几个核心的成本 对GPU来说就是多几百上千个核心的成本)
CPU处理一次标量乘法只要一次标量乘法指令
GPU却把标量先转换成向量 然后用一条SIMD指令

CPU每个核心有独立的缓存 GPU基本是所有核心共享一个缓存(GPU主要做图形渲染 所有核心都执行同一份指令 获取同样的数据 CPU主要是执行多个串行任务 每个核心可以处理不同的任务 从不同地方获取不同的数据)
所以CPU单核性能秒GPU单核十条街

CPU每个核心都有独立的优化 分支预测 乱序执行之类的
GPU乱序执行可以有 因为所有核心都干一样的事情 可以共享一份指令 不需要独立的乱序执行 (不过一般不会有 因为这个功能可以直接放到编译器中实现 因为GPU的开发语言少 基本只有GLSL和HLSL 编译器是厂商自己开发的 不像CPU那样 开发语言多如牛毛 各种编译器五花八门 指令集大相径庭 所以才迫切需求这种动态的乱序执行优化)
分支预测肯定不会有 成本上来说分支预测不能共享 每个核心都多一个分支预测的逻辑单元成本太大
关键是根本就不需要 GPU程序一般都很短 本来就可以全部装载到高速缓存中 其次是对于GPU处理的任务而言 分支预测也无意义

GPU的强项是并行运算能力比CPU强(多个不同任务的并行运算GPU也无法胜任 GPU只适合处理单个可并行任务的并行运算) 而不是浮点运算能力强(这个谣言也不知道谁传出来的 非要强调浮点运算 非要说浮点运算的话 不如说大多数老式GPU甚至没有整数运算能力 因为根本没有整数指令 最早设计目的是加速图形渲染 基本都是浮点运算 所以GPU核心的SIMD指令 只有浮点指令 没有整数指令 新型GPU因为不光光用于图形渲染 还想推广到通用计算 就是所谓的GPGPU 所以开始加入整数运算的支持)

GPU完全是为了并行运算设计的
只有可并行 无数据依赖的运算在GPU上才会快

举个简单的例子
CPU的核心就像一个心算高手 并且掌握各种奇技淫巧 一分钟能算100次四则运算
GPU的核心就是一个普通人 一分钟能算10次四则运算
但是 你让10个心算高手合作算10000个四则运算 和 1000个普通人合作算10000个四则运算
你说谁完成的快?
当然是1000个普通人快
(10个心算高手每人算1000个要花10秒 1000个普通人每人算10个只要1秒)

但是如果这10000个四则运算有依赖 就是下一题的条件依赖于上一题的结果
你说谁算的快?
当然是心算高手快 因为一旦有这种强依赖 就只能串行 10个人干和1000个人干并不会比1个人干来得快
(1个心算高手只要花100秒 1个普通人要花1000秒)

还要打个比方的话
一个四核CPU就像4台高级数控机床
一个GPU就像一个全自动流水线

一个全自动流水线 如果你只让他生产一个东西 绝对不会比一台高级数控机床快
它要成批生产 才会快
全自动流水线它只能同时成批生产一种东西
高级数控机床 什么都能生产 并且4台可以同时生产不同的东西

并且流水线上能做的东西 高级数控机床肯定能做
但是反过来 流水线上就不一定能做了

Last modification:February 22nd, 2018 at 01:10 am
If you think my article is useful to you, please feel free to appreciate