此外,Kepler的SLM允许配置成64bit模式,从而提供2倍带宽,这对于DP密集的运算无疑是件好事。 由此也可看出,当年的HPC是多么青睐FP64,而Kepler又是多么倾向于HPC。 顶点处理一般很容易并行,毕竟early-z也是发生在Vertex Shader之后。 相比之下光栅化相关的模块被放在Raster Engine,位于SM外(TPC里)。 根据一些论文的描述,Fermi的寄存器被分为8个cluster(4K/cluster)。 每个cluster又分为4个bank(1K/bank)。
这是Kepler的新特性dual issue,意味着每个warp在1个周期发射2条没有依赖关系的指令,属于提升ILP的操作,其实就是CPU上常见的多发射。 Kepler的CUDA Core是原先的6倍,而dual issue使得每周期能发射的指令也变为了原先的4倍。 nvidiagpu 一个端口下只有16个CUDA nvidiagpu Core,依旧小于warp的32线程,所以如图所示,其实需要2个周期才能把warp的指令完全送入ALU。 再考虑到双倍频率,调度单元是真正做到每个周期1条指令了。
nvidiagpu: 哪款 GPU 适合您?
而到了Kepler架构,因为指令的执行周期是可以预计的,所以调度信息其实在编译期就能确定了。 于是ISA就做了更改,每7条指令为一组,附加一段调度信息(Control Code),把因为数据依赖需要等待的cycle数记录进去。 再看看SM架构图,单个block里FP32减半的原因就找到了。 对于1个warp共32个线程,交给16个单元去执行的话,要像G80等架构提到的那样占用连续的两个周期来完成issue。
TuringTuring,建立在Volta架构上的又一次创新。 依旧是4个block,里面主要区别是阉割了FP64,LDST砍半,以及把格子画大了些。 SLM部分,又像Kepler一样和L1整合在一起了,只不过这次SLM部分可以分配到96KB,两者一共128KB。 这里的L1又和Kepler的L1不一样,因为Tex单元也在用这个Cache,Global Memory访问也会经过这个它,把各种功能给统一了。 每个Tensor Core每周期能做4x4x4的GEMM,即64个FMA。
nvidiagpu: 指令调度
根据测算,大多数运算指令的延迟都从9cycle降低到了6cycle,这个值已经和CPU很接近了。 降低延迟带来的好处就是只用更少的指令就能使ALU满载,达到理论性能变容易了。 硬件scoreboard就是记录各个组件(寄存器、执行单元)当下的情况,并自动根据指令涉及的操作数、ALU去匹配。 软件scoreboard可以看作是预分配几个信条量,有依赖关系的指令会显式声明对哪几个信号量做操作,这样一来要记录维护的信息变少了,逻辑也简单了。
Tegra X1的GPU也是基于Maxwell架构的,不过又有些不同————它具有FP16的运算能力,吞吐量为FP32的2倍。 比较值得注意的一点改变是,Kepler的L1 Cache是用来为reg spill或者stack data服务的,即访存数据其实并不会缓存在L1里。 引入这个单独模块的原因估计还是Tessellation曲面细分,毕竟这是DX11新引入的特性,N卡专门做了单独的模块并宣传了一波。 显卡对比图里著名的“N卡 曲面细分”梗也来自这个时期。 Turing的一个隐藏改进在于,引入了Unifrom Register的概念。
nvidiagpu: 指令调度
规模增大是有原因的,其中一个因素就是之前的shader clock被取消了,ALU运行频率就是GPU的频率。 频率和功耗不是线性关系,降低了运行频率自然能提高一些能耗比。 此外Fermi开始,FPU是符合IEEE标准的,所以别说什么GPU算浮点不准确了。 本来按照规范浮点计算就是容许ulp级别的误差的,计算时还有各种rounding模式,也会导致结果不同。
而且SFU现在也能做单精度乘法了(相对应的,SP能做FMA运算等效为2倍吞吐)。 而G80提出了通用计算的概念,这意味着运算的对象可能是其他东西,不一定能凑成4单位的向量了。 为了提高通用性,G80就引入了标量计算的概念,运算粒度变小了,而同期的AMD只是在旧架构上做修改,依旧是4D向量。 RT Core虽然强,离完全实时光追渲染还是有挺大距离的。
nvidiagpu: 哪款 GPU 适合您?
Fermi的一大亮点在于,SM里有2个warp scheduler、Dispatch Unit,这意味着每周期可以从2个warp中各发射1条指令。 从这个角度看Fermi的SM差不多就是Tesla的2个SM合并得来的,不过SP单元翻倍了。 nvidiagpu 根据前面的测算,SP的latency最短24cycle(这里说的是ALU的cycle),包括整数加减,24bit乘法,浮点的加减乘(包括FMA),逻辑运算。 32bit整数的乘法需要96cycle,fma还需要多24cycle。 nvidiagpu ALU执行是流水线化的,即一项操作会被分为X个步骤由X个组件去处理,每个步骤都耗费1周期。
前者是NV自己的私货,是FP16和FP32的缝合怪,比FP16慢一些;后者是更广泛被接受的格式,Intel的Coperlake就支持这种格式。 Tensor CoreTensor Core也是一大革新。 前面的图里还有个重要的细节,Z原本是在branch外的,理应被整个warp共同执行;但是现在它有可能被两部分warp分开执行。 其实图上描绘得很清晰了,原本自动插入的reconverge不见了,现在需要手动sync。
Ampere标注的CUDA nvidiagpu Core比上一代轻松翻倍,让人难以相信。 而后来测试成绩解禁后又没能达到理论的2倍提升,于是让人怀疑这只是文字游戏。 RT Core主要用来做三角形与光线的求交,并通过BVH结构加速三角形的遍历。 由于布置在block之外,相对于普通ALU计算来说是异步的(和Tex单元类似)。
- Volta的ISA又发生了改变,之前3条指令1个bundle也满足不了了,所以现在是每条指令带一个Control Code,共计128bit。
- 不过GP100没有增加这个特性,剩下的GP102、GP104、GP106是有的。
- 虽然对于开发者来说,vertex shader和fragment shader的概念依旧存在,但底下执行的单元却被统一了,即由流处理器来进行处理。
- 不清楚DP单元应该被归到哪里(Anandtech说是1/3的CUDA Core能做DP,但是这数量不够整除啊)。
- Tesla的SM做了些改变,增加了1个独立的DP单元用于做双精度FMA。
而AoS是先按照所需的数据结构去排布,然后再组成数组。
由香港SEO公司 featured.com.hk 提供SEO服務
- 如上的写法是完全合理的,线程A的a可能就是线程B里的b,这样实现了线程间的同步机制。
- 有个缺点就是N卡的FP16是要打包操作的,即必须2个FP16一起才能发挥全部吞吐。
- 在FP16的计算支持上,黄氏刀法依旧得到了很好的体现。
- 不过GPU一直强调要减少调度单元的开销,而这么做会打乱编译器对指令延迟的预计(本来4+1cycle,现在4cycle),可能增加调度单元的复杂度。
- 指令延迟的变化也很好地反映了这一点,大多数简单指令的延迟都减半到了9cycle,统一延迟也有利于编译器的调度优化。