微操作μ-op与宏操作macro-op

一 微操作μ-op与宏操作macro-op
英特尔sunnycove内核前端
图片来源:英特尔
上图为英特尔sunny cove内核前端。因为cisc的指令长度不确定,且比较复杂,英特尔将这些指令切割成固定长度,这个微指令从pentium pro开始在ia架构出现。处理器接受的是x86指令(cisc指令,复杂指令集),而在执行引擎内部执行的却不是x86指令,而是一条一条的类risc指令,intel 称之为micro operation,即micro-op或μ-op,一般用比较方便的写法来替代掉希腊字母: u-op或者uop。相对地,融合了多条指令的操作就称之为macro operation或macro-op,即宏操作。   英特尔逐渐改进微指令,后来加入微指令缓存即uop cache,也有的地方叫l0级缓存,表面看来,uop cache被定位为一个2级指令cache单元,是1级指令cache单元的子集。其独特之处在于它所存储的是译码之后的指令(uops)。早期micro-op cache是由32组8条cacheline组成。每条cacheline最多保留6条uops,共计1536条uops,sunny cove是48组,也就是2304条uops。这个cache是在两个线程之间共享的,并保留了指向micro sequencer rom的指针。它也是虚拟地址寻址,是l1指令cache的严格的子集。每条cacheline还包括其包含的uop数量及其长度。   内核一直都在处理来自指令流(instruction stream)的连续的32byte信息。同样地,uopcache也是基于32byte窗口。因此uop cache可以基于lru(least recently used)策略存储或者放弃整个窗口。英特尔将传统的流水线称为“legacy decode pipeline”。在首次迭代时,所有的指令都是经过“legacy decode pipeline”。一旦整个指令流窗口被译码并且发送到分配队列,窗口的拷贝就被发送到uop cache。这是与所有其他操作同时发生的,因此这个功能没有增加额外的流水线阶段。后续的迭代,被缓存的已经解码好的指令流就可以直接被发送到分配队列了,省却了取指、预译码和译码的阶段,节省功耗,增加了吞吐量。这也是一个更短的流水线,延迟也减小了。   uop cache有着高于80%的命中率。在取指期间,分支预测器将会读取uopscache的tags。如果命中了cache,会可以每周期发送至多4条uops(可能包含了fused macro-ops)到instruction decode queue(idq),绕开了其他所有本该进行的预译码和译码。
armcortex-a77微架构
图片来源:arm
上图为arm cortex-a77的架构图,自a77开始,arm也添加了经解码后的指令缓存,与英特尔的uop缓存高度类似,只不过arm反其道用之,英特尔是把cisc指令切割成微指令,arm是融合,把定长定格式的risc指令融合成宏操作mop(macro operation),然后再分割成uop。这样做可能是risc指令分得太散,有些是可以融合的,这样效率更高。再有就是解码器通常比后端吞吐量更高,有足够的mop缓存可以让后端工作更饱和,利用率更高。   a78也是如此,每周期4个指令,6个mops,x1则不同,每周期5个指令,8个mops。
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。还有两个分支针对特定计算类型。
图片来源:互联网
所有计算机程序的本质,是指令的执行过程,从根本上说,也就是处理器的寄存器(register)到内存之间的数据交互过程。这个交互,无非两个步骤:读内存,也就是加载操作(load), 从内存读到寄存器,写内存,就是存储操作(store),从寄存器写入到内存,lsu就是load store unit。   lsu部件是指令流水线的一个执行部件,其上接收来自内核的lsu发射序列,其下连接着存储器子系统即数据缓存。其主要功能是将来自cpu的存储器请求发送到存储器子系统,并处理其下存储器子系统的应答数据和消息。在许多微架构中,引入了agu(寻址生成器)计算有效地址以加速存储器指令的执行,使用alu(计算单元,通常是标量计算单元)的部分流水处理lsu中的数据。而从逻辑功能上看,agu和alu所做的工作依然属于lsu。

定点与浮点
所谓定点格式,即约定机器中所有数据的小数点位置是固定不变的。通常将定点数据表示成纯小数或纯整数,为了将数表示成纯小数,通常把小数点固定在数值部分的最高位之前;而为了将数表示成纯整数,则把小数点固定在数值部分的最后面。
比如十进制的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条。
图片来源:互联网
最后是加载和写入部分。
zen2 die shot
图片来源:互联网
zen 2代一个核的透视图,可以看到缓存占芯片的面积最大,其次是浮点运算用的simd,然后是分支预测,加载与写入,译码,计算用的alu所占面积很小。


IDC:2018年Q4全球可穿戴设备出货量为1.722亿台 同比增长27.5%
智能座舱人机交互模式的未来发展趋势
UR10协作机器人小手臂大提升 为福特汽车生产流程带来附加值
简易电池小电动机制作
贾跃亭似乎又有了“新故事”可以说
微操作μ-op与宏操作macro-op
无人机商用有什么趋势
14位ADC SC1254在无线电接收机的应用
贴片陶瓷电容的结构和特性
Linux主线正式支持赛昉JH7100芯片
118万台苹果出货!目前iPhone8和iphone8plus已超过162万的预约量,库克这场饥饿营销战实在打的漂亮
如何使用Flex传感器和电位计构建愤怒小鸟的游戏控制器
利用Tensorlow及其API为例来进行讨论,理解深度学习背后的魅力
自动驾驶的巨大商机,MIPI和以太网将发生怎样的竞争?
搭载麒麟990 5G芯片的设备,AI跑分高达76206
IntraSense系列传感器应用新突破:植入体内监测肿瘤
光电编码器的工作原理 光电编码器分为哪两种
小米6劲敌出现!8GB内存加持!这性能太残暴
关于黄曲霉毒素分析仪的产品说明
微软曝光帮助准备会议专利,举办会议更方便