NVIDIA N卡与AMDA卡区别
比如A卡的VEGA架构和Pascal架构的区别
VEGA64 流处理器4096,单精度浮点12+Flops,理论性能和GP100有的一拼,功耗也差不多(230W),可是实测性能却只能和1080(GP104 流处理器2580 单精度8TFLOPS TDW180W)打平手?
A卡的基本执行部件为SIMD(此处可能写为SIMD阵列的SIMT执行模式更为贴切?),而N卡的基本执行部件为SIMT(此处可能写成lock-step的MIMD更为贴切?)。这是最为根本的区别。SIMD是单一指令多个数据,比如,一条SIMD的加法指令,可以对4对以上的整数执行加法。SIMT则是单一指令多个线程,从表面上来看,依然是一条加法指令可以对多个数据同时执行操作。
SIMD是单一指令多个数据,比如,一条SIMD的加法指令,可以对4对以上的整数执行加法,SIMT则是单一指令多个线程,从表面上来看,依然是一条加法指令可以对多个数据同时执行操作。SIMD就好像工厂里面的机器,有一个包含很多槽位的模具,整体一次注入蛋液,整体送入烤箱,然后整体出来。SIMT则是很多条蛋糕生产线,每条线只有一个槽位。这些生产线由一套控制系统统一控制,在任何时候动作是保持一致的。结果上来说,两者似乎是等价的。但是明显后者成本更高,因为每条产线都是独立的,有很多重复的设备。
N卡为什么选择了SIMT这种看起来有些费力不讨好的方式呢?
GPU当中,虽然两种架构都是对大量数据进行并行化处理,但是A卡的SIMD要求被处理的数据在地址空间连续(也许说索引连续更准确),在一个批次(wavefront)当中可以使用的寄存器组也只能是一个(蛋糕模组是一个整体),也就是thread之间会有所谓“相邻寄存器”的约束。在N卡当中就没有这样的要求,每一个批次(warp)当中的每一个thread都可以有独立的寄存器组使用,也可以访问内存上不连续的数据。A卡也可以利用其SIMD核心结构简单单一核心所需寄存器文件小的优势粗暴堆核心来平衡,这也是为什么A卡的核心数量一般远多于N卡同等级的数量的原因。
对于诸如光追这种明显的稀疏数据结构,不同的thread在计算几次(光线反弹几次)之后的路径大相径庭的时候,N卡的优势就出来了,而且这种差异很难通过单纯堆核心数去弥补。
虽然SIMT名义上支持RAM的随机(不连续)访问,但是由于实际上依然会遇到访存时Bank冲突问题,即便在N卡上也要尽可能关注随机不连续访存可能带来的性能问题,对于buffer当中的数据组织形式要进行安排。
SIMD也并非就完全没有办法实现随机分散访存,通过引入额外的寄存器(每个thread一个)到寻址当中,或者在寻址当中支持vgpr,同样是可以实现的。只不过不同thread使用不同的寄存器组,这个目前还是有些困难。
A卡和N卡的架构有什么区别?
比如A卡的VEGA架构和Pascal架构的区别
VEGA64 流处理器4096,单精度浮点12+Flops,理论性能和GP100有的一拼,功耗也差不多(230W),可是实测性能却只能和1080(GP104 流处理器2580 单精度8TFLOPS TDW180W)打平手?
学CUDA之前花了一星期的晚上学习了显卡的简单原理+A卡架构粗略+N卡架构粗略,非常皮毛,具体要对比两家的架构异同并分析出门道来,肯定要一本书。
以我的皮毛知识得出的结论:NVIDIA的GPU在一开始就选择了正确的方向MIMD,通过G80 Series,Fermi,Kepler和Maxwell四代大跨步进化,形成了完善和复杂的储存层次结构和指令派发/执行管线。ATI/AMD在一开始选择了VLIW5/4即SIMD,通过GCN向MIMD靠拢,但是进化不够完全(GCN一开始就落后于Kepler),所以图形性能和GPGPU效率低于对手,完全不同意某些回答认为的GCN同NV这边效率差不多,SP单元的频率相同数量相同但是功耗翻倍说明两个架构效率差不多?完全无视GCN寄存器的低效率?逗我呢,NV光Cache/Buffer的层次结构就甩了GCN几条街。
简单的说,事情的开端是微软在DX10提出了统一渲染单元(Unified Shader),把以前的Vertex Shader和Pixel Shder的功能合并了,厂家可以自行选择如何实现。NVIDIA认为由于指令的灵活性(一条指令可能会操作不定个数的数据),最高效率是完全打散计算单元(流处理器,Stream Processor),所以搞出了G80系列,并拥有很强的CUDA性能。CUDA执行模型是SIMT(单指令多线程),G80会在物理上把若干个(G80是8个)流处理器组合到一起,共享缓存,形成一个SM单元(Stream Multiprocessor)。因为单个SM里的所有流处理器共享缓存,所以CUDA模型里,会把多个Thread打包成一个Block,让Block内的线程在同一个SM里跑(实际执行粒度是Wrap,Block内的Threads不是同时跑的,但是线程切换开销极低,这个和CPU不同,因为显卡的寄存器数量巨大,可以理解为拥有很多个超线程的CPU,对超线程技术有了解很好理解,因为Intel的超线程技术就是分时调用Decoder但每个线程独享寄存器),Block内的线程间可以数据同步,不同Block间线程则不行。YouTube上有个视频很形象的把这种模型类比成OpenMP+MPI。
编程角度清晰的观点:CUDA GPU的内存模型同超算类似——单处理器(SM)共享缓存,处理器间需要分布式中间件支持实现同步。从CUDA的编程模型可以窥见NV的设计思路。
上面我好几处都用了“若干个”,因为这个数量配比在每一代都会有变化,而且对SM的定义也有变化如SMX,SMM,当然还有TPC、GPC等更高级SM集群的概念。核心依然是——NVIDIA在精心地、大胆地调配Stream Processor、Dispatcher、Register File、Buffer、Cache等单元的层次结构和数量配比。当然细化到每个单元,每一代都有支持新的特性。所以NV这四代的架构给人感觉差别特别大,远大于GCN1.0-4.0的差异(AMD还是没钱啊)。
G80 Series,可见8SP+2SFU为一组,两个SM执行相同的指令(一个TPC只有一个Scheduler,所以G80是16-way的SIMD,和GCN异曲同工!),注意Shared Memory和Texture Cache是不同的。Fermi,直观的看像是两个G80 SM的合并。Kepler,SM进一步扩大,现在叫SMX。Maxwell,缩减了SMX的SP数量并分割成4组,此时叫SMMPascal,砍了一半SP,增加DP单元,寄存器翻倍Volta,NV史上最奇怪的SM,纯粹为了AI计算而设计出来的到AMD这边,一开始AMD迷信VLIW(其实当时挺成功的),VLIW5即5个流处理器为一组,后期出现了VLIW4(HD6990),期望通过把多个操作不定长数据的指令打包成一条操作定长数据的指令来执行(指令级并发ILP,NV是线程级并发TLP+ILP,效率更高),例如3+2=5,1+4=5——请注意这个过程是通过编译器实现的,也就是并非硬件调度!
在VLIW强行扩展规模好几代之后,AMD意识到了效率和通用计算的缺乏,开始学习NV的MIMD思想,推出了GCN(CPUGPU两个VLIW都死了,不过ATI的这个在当时是很成功的):一个dispatcher对应16个流处理器和64kb寄存器文件,成为一组,四组+前端构成了一个CU单元,外带一个独立的流处理器和4kb寄存器文件。CU单元使得AMD也拥有了SIMT的能力。但是,CU单元的这种层次结构,在硬件上容易设计,但实际依然是以SIMD组来执行的。
VLIW概览跨时代的GCN的CU单元,16-way SIMD X4+1 Scalar SP
Vega的NCU,强调“ Rapid Packed Math”,即支持两个16bit数打包成32bit的计算
非常巧合的是,GCN是16个SP对应一个Dispatcher,Maxwell也是平均16个sp享有一个Dispatcher,但是Maxwell的前端显然强得多,这是NVIDIA在四代MIMD的不断尝试下的成果。
其实Kepler的时候,已经出现了虽然HD7970GHZ性能和GTX680性能相同频率接近,但是NV的能耗比明显优于AMD的情况了,到麦克斯韦又大幅调整了执行管线和储存层次结构(SMX —> SMM),AMD的修修补补就落后太多了。
参考链接:
https://www.zhihu.com/question/267104699/answer/2346626264