一 微操作μ-op与宏操作macro-op 图片来源:英特尔 ARMCortex-A77微架构 图片来源:ARM A78译码到分布 图片来源:互联网 二 发射与执行 ARM和AMD的执行单元一般将整数计算(ALU)与浮点计算(FPU)分开,英特尔则是合二为一,执行端关键的参数是发射宽度(Issue Width),目前最宽的是ARM的V1,多达15位,宽度越宽,ALU和FPU数量可以越多。通常ALU是4个,整数运算单元4个就够。V1有4个ALU,4个针对浮点的NEON,其中包含两个SVE。3个Load加载,2个写入Store。还有两个分支针对特定计算类型。 图片来源:互联网 三 定点与浮点 所谓定点格式,即约定机器中所有数据的小数点位置是固定不变的。通常将定点数据表示成纯小数或纯整数,为了将数表示成纯小数,通常把小数点固定在数值部分的最高位之前;而为了将数表示成纯整数,则把小数点固定在数值部分的最后面。 比如十进制的3.75,那么你可以用011+0.11,但是这种加法首先要对齐位宽,对齐目的就是让大家的单位一致。你可以把011扩展为011.00,把0.11扩展为000.11,这样一相加就得到011.11,就是十进制的3.75了,存在电脑的时候,电脑是没有小数点的,只会存为01111。如果是定点格式,这个小数点的位置就固定了,无法变动,由于计算的时候必须对齐位宽,这使得电脑能处理的数据范围受到限制,不能太大,也不能太小。假设以一个字节表示小数,小数点固定在5.3的位置,高5位表示整数,低3位表示小数:11001_001 —— 11001.001,转换一下:整数部分11001= 25, 小数部分001 = 1(分子部分) 分母是1000(8),所以小数部分1/8(二级制只有0和1)。最终的小数表示是 25+ 1/8,即存在 0/8, 1/8,2/8, …. 7/8共八个档,表示精度为1/8,所以定点小数存在数值范围和数值精度的问题!数值范围与精度是一对矛盾,一个变量要想能够表示比较大的数值范围,必须以牺牲精度为代价;而想精度提高,则数的表示范围就相应地减小。在实际的定点算法中,为了达到最佳的性能,必须充分考虑到这一点,即权衡动态范围和精度。 如果是逻辑运算或简单的整数运算还可以,如果要显示比较大的变量,小数点的位置必须可以自由移动,这就是浮点。 图片来源:互联网 比如123.45用十进制科学计数法可以表示为1.2345x102,其中1.2345为尾数,10为基数,2为指数。浮点数利用指数达到了浮动小数点的效果,从而可以灵活地表达更大范围的实数。IEEE754指定了:两种基本的浮点格式:单精度和双精度。其中单精度格式具有24位有效数字(即尾数)精度,总共占用32位;双精度格式具有53位有效数字(即尾数)精度,总共占用64位。 两种扩展浮点格式:单精度扩展和双精度扩展。此标准并未规定这些格式的精确精度和大小,但指定了最小精度和大小,例如IEEE双精度扩展格式必须至少具有64位有效数字精度,并总共占用至少79位。 浮点运算和定点运算(整数运算)不同,它通常是6个步骤:1. 异常检测:主要检测NAN(非数) 2. 对阶,尾数右移:不同阶码尾数不能直接相加减,所以需要对阶,比如1.1 * 2 E 1 + 1.1 * 2 E 2 尾数就不能运算,对阶,尾数右移,最终阶码一致。3 . 尾数求和求差,将对阶后的尾数按定点加减运算规则进行运算。4. 规格化:把非规格的小数转换为规格化的小数。5. 在对阶和右移过程中,可能会将尾数的低位丢失,引起误差,影响精度,为此可用舍入法来提高尾数的精度。IEEE754标准列出了四种可选的舍入处理方法:向上舍入,向下舍入,向最近舍入,直接截去。6. 溢出检查,与定点数运算不同的是,浮点数的溢出是以其运算结果的阶码的值是否产生溢出来判断的。若阶码的值超过了阶码所能表示的最大正数,则为上溢,进一步,若此时浮点数为正数,则为正上溢。若浮点数为负数,则为负上溢。进一步,若此时浮点数为正数,则为正下溢,若浮点数为负数,则为负下溢。正下溢和负下溢都作为机器零处理,即将尾数各位强制为零。 四 具体CPU微架构 特斯拉使用AMD的CPU,因此特别对AMD的微架构做以说明。 图片来源:互联网 这是Zen 2代微架构的前端,ITLB就是 Instruction Translation Lookaside Buffer,另一种说法是指令转换后备缓冲区。AMD的L0/L1/L2缓存与传统的缓存定义不同,它解签了软件意义上的缓存而非硬件,L1里有BTB缓存,Hash路径缓存表,ITLB缓存好几种。Zen3代则将L1的BTB缓存由512条扩展到1024条,提高分支预测准确度。虽然L1缓存异常复杂,但总容量还是32K,分8路。Return Stack是方法返回栈,可能是分支预测异常的返回地址。 分支预测器经过Micro tags最终变为8个宏操作Marco Ops,进入宏操作缓存,缓存量为4K条,指令缓存排成序列,进入译码器,译码器宽度是4位,8个宏操作和4个译码后的指令进入OC/IC,分解为微操作序列,再分别进入堆叠引擎和存储独立侦测系统还有微码序列ROM,再进入分发站。 图片来源:互联网 Zen2代微架构的执行端,执行端分整数和浮点两大执行器,绿色为整数,粉色为浮点。整数部分指令经过重命名和定位后进入序列器,完成后提交或者说退出Retire再进入物理寄存器文件,再前向混合,进入ALU4个算数计算器,3个地址生成器。Zen3代的寄存器条目增加到212个。浮点方面寄存器略少,FADD和FMA分别是加法和乘法管线,管线有4条,Zen3代增加到6条,不过计算管线还是4条。 图片来源:互联网 最后是加载和写入部分。 图片来源:互联网 Zen 2代一个核的透视图,可以看到缓存占芯片的面积最大,其次是浮点运算用的SIMD,然后是分支预测,加载与写入,译码,计算用的ALU所占面积很小。 |
|