- 金属破碎机
- 破石机
- 石头破碎机
- 颚式破碎机
- 反击式破碎机
- 锤式破碎机
- 复合式破碎机
- 冲击式破碎机
- 立式复合破碎机
- 重锤式破碎机
- 花岗岩石破碎机
- 高效破碎机
- 双齿破碎机
- 煤矸石破碎机
- 四辊破碎机
- 环锤式破碎机
- 小型破碎机
- 双轴破碎机
- 单辊式破碎机
- 对辊式破碎机
- 圆锥式破碎机
- 振动给料机
- 圆振动筛
- 斗式提升机
- 直线振动筛
- 电磁振动给料机
- 滚筒筛沙机
- 高频筛
- 振动筛
- 滚筒洗石机
- 干式磁选机
- 螺旋溜槽
- 螺旋分级机
客户购机前,公司免费派工程技术人员到用户现场为用户规划场地、...
- 最近写CUDA写出精神病,以NVIDIAGPU为例分析下GPU的相比CPU有几个特点运算资源非常丰富控制部件占的面积比较小内存带宽大,目前独显都采用GDDR5显存,位宽也高,主流独显内存带宽是CPU的十倍(200GB/s对比20GB)内存延迟高,对比CPU使用多级缓存掩盖延迟,GPU采用多线程掩盖延迟寄存器资源极为丰富,32bit寄存器有64k个,单线程可用255个所以,GPU只适合处理分支少,数据量大,延迟不敏感的任务。先看一个GTX1080(Computecapability6.1)的SM(streammultiprocessor)结构CC6.0SM,来自NVDIA可以看到,一个SM中包含4个Warp,每个Warp含有32个CUDACore【1】。那么,是不是一个Warp就相当于CPU的32核呢?一、GPU不适合处理大量分支www qq2138.com上面说了,GPU控制部件面积比较小,为了节约控制器,32个CUDACore必须时刻执行同样的指令。也就是说,一个Warp内部的所有CUDACore的PC(程序计数器)一直是同步的【2】,但是访存地址是可以不同的,每个核心还可以有自己独立的寄存器组,这种执行方式叫做SIMT(SingleInstructionMultiTrhead)。这是,你可能会问,如果这一个Warp中永远都在执行相同的指令,如果分支了怎么处理呢?问的好,其实Warp中的CUDACore并不是真的永远都执行相同的指令,它还可以不执行啊Anexampleofwarpdivergence(http://15418.courses.cs.cmu.edu/spring2013/article/11)这样会导致WarpDivergence(见上图)。如果极端情况下,每一个Core的指令流都不一样,那么甚至还可能导致一个Warp中仅有一个Core在工作,效率降低为1/32.二、GPU需要数据高度对齐别看GPU一个Warp核心这么多,带宽看起来这么大,但是实际上一个一个Warp的内存访问是成组的,一次只能读取连续的且对齐的128byte。【3】(这正好是WarpSize32*4byte)摘自《ProfessionalCUDAProgramming》上图这种操作的效率是最高的。如果访问完全分散,那么效率可能会又变成1/32.如下图。摘自《ProfessionalCUDAProgramming》而且NVIDIAGPU的缓存策略和CPU也不同,没有时间局部性DIFFERENCEBETWEENCPUL1CACHEANDGPUL1CACHETheCPUL1cacheisoptimizedforbothspatialandtemporallocality.TheGPUL1cacheisdesignedforspatialbutnottemporallocality.FrequentaccesstoacachedL1memorylocationdoesnotincreasetheprobabilitythatthedatawillstayincache.--《ProfessionalCUDAProgramming》你可能又会问,CPU的Cacheline不也有64bytes嘛,也就比GPU少一半啊,这有什么差别吗?当然有,CPU是一个核心一个L1,GPU是两个Warp一个L1Cache【4】。整个Warp有一个核心数据没准备好都执行不了。当然,这么苛刻的访存条件,如果真的做C=A+B还是没什么问题的,现实中访存不会真的这么对齐,所以NVIDIA也下了很多功夫,准备了Cache和SharedMemory,ConstantCache等部件,力求让程序员能高效访问内存。三、GPU访存延迟大说起来访存延迟和上一节的对齐还是有不少关系,这里分开讲。你可能还注意到,一个SM(CC6.1)最多可同时启动1024个线程,但是一个SM中仅有4个Warp共计4*32=128个CUDACore。显然一个SM可以启动的线程数比CUDACore的数量大好多。这是为什么呢。www qq2138.com看下典型的GPU访存延迟(《ProfessionalCUDAProgramming》数据可能有点老)10-20cyclesforarithmeticoperations400-800cyclesforglobalmemoryaccesses访存一次能做40个运算啦!但是GPU的显存带宽实际上是非常高的。怎么能让CudaCore尽量满载呢?这时SIMT就上场了。没关系,这个Warp(这里指32个线程,之前文中混淆了调度单位和硬件单位)在等数据准备好,www qq2138.com可以执行另外一组32个线程嘛,这样虽然延迟还是很大,但是CUDACore和Memory都能够充分利用。GPU的线程切换不同于CPU,在CPU上切换线程需要保存现场,将所有寄存器都存到主存中,而www qq2138.com最开始说了,一个SM中有高达64k个(注意不是64kbytes,有些中文书写错了)4bytes寄存器。而每个Thread最高使用的寄存器数量为255。少年你发现什么了吗?256*4*32=32k。也就是说www qq2138.com每个线程把寄存器用到爆,也才用了一半的寄存器,那多出来的这些寄存器是干啥的?其实,GPU的线程切换只是切换了寄存器组,延迟超级低,几乎没有成本。考虑到通常线程并不会使用高达255个寄存器,实际上一个CUDACore可以随时在八个线程之间反复横跳,那个线程数据准备好了就执行哪个【5】。这是GPU优于CPU的地方,也是为了掩盖延迟没办法的事情。总而言之,GPU访存还是需要对齐,而且延迟还是很大,但是最大吞吐量(在场景合适的情况下,一个比较长的单位时间,处理的数据量)是远高于CPU的。【注1】LD/SD是存取部件,用来访问显存,SFU为超越函数单元【注2】Volta架构重大更新,目前允许每个线程有单独PC【注3】经过L1Cache的数据读取是以128byte为单元,还可以配置为不经过缓存,单元大小为32byte,写入操作单元大小可以为为32,64,128bytes,本条说的都是GlobalMemoryaccess。【注4】NVIDIAGPU的Cache最近几代架构变化明显,具体架构请具体分析【注5】实际上线程切换是以Warp为单位
GPU不能完全取代CPU的最大原因是什么
2019-11-11 04:50:44
- 上一条:上一篇:AppStore美国区TopGrossing第一位的收入大概有多少
- 下一条:下一篇:Python中除了matplotlib外还有哪些数据可视化的库