我最近一直在研究称为Mill的CPU体系结构的概念。
用于CPU中各种事物的磨机(尽管可能是汽机)uses metadata,例如软件投机负载产生的值标记为不是结果(NaR
)。如果以后的指令尝试以非推测方式存储该结果,则硬件会检测到该错误并出故障。
我想知道在架构中使用元数据的意义上是否还有其他CPU相似。
是的,IA-64 Itanium还具有not-a-thing
加载结果,如果您读取结果,这些结果将出错,原因与Mill的软件推测原因相同。其架构师将其描述为EPIC ISA。 (EPIC =显式并行指令计算,与CISC或RISC相对。它也是VLIW。)From Wikipedia:
该体系结构实现了大量寄存器:
128个通用整数寄存器,它们是64位加上用于推测执行的一个陷阱位(“ NaT”,代表“不是事物”)。其中的32个是静态的,其余的96个则使用可变大小的寄存器窗口堆叠,或者为流水线循环而旋转。 gr0始终读为0。
128个浮点寄存器。浮点寄存器的长度为82位,以保持中间结果的精度。代替整数寄存器那样的专用“ NaT”陷阱位,浮点寄存器具有一个称为“ NaTVal”的陷阱值(“不是事物值”),类似于(但不同于)NaN。它们还具有32个静态寄存器和96个窗口或旋转寄存器。 fr0始终读为+0.0,而fr1始终读为+1.0。
因此,对于整数,确实存在单独的元数据。对于FP,元数据被带内编码。
[与软件可见的推测有关的元数据的其他示例包括:
x87 FPU有8个体系结构寄存器,但是普通指令将它们作为寄存器堆栈进行访问,其中st(0)
的基础寄存器由x87状态字中的字段确定。 (即,元数据在结构上是可见的,可以用fincstp
进行修改以旋转“左轮手枪的枪管”。)请参见fincstp
以获取良好的图表并介绍x87设计。而且,x87对每个寄存器都有一个空闲/使用中标志;尝试加载到已在使用的寄存器中会产生FP异常(如果屏蔽了异常,则会生成NaN)。通常,通过使用http://www.ray.masmcode.com/tutorial/fpuchap1.htm“弹出”寄存器堆栈来存储和弹出(或其他方式)来清除使用中标志,但是还有fstp
将任何x87寄存器标记为空闲。data
,而不是代码:在AMD Bulldozer系列和Bobcat / Jaguar中,SIMD FPU显然保留了一些额外的元数据以及实际的体系结构寄存器值。ffree
,(Bulldozer系列)19.11不同执行域之间的数据延迟:
当将浮点计算的输出输入到浮点时,会有很大的损失以不同的精度计算点,例如,如果输出为双精度浮点加法被输入到单精度加法中。这几乎没有任何实际意义重要性,因为这样的序列很可能是编程错误,但是它表明处理器存储有关128位以外的浮点数的其他信息在XMM寄存器中。在英特尔处理器上看不到这种效果。
[这可能与以下事实有关:从FMA单元指令转发到另一FMA指令时,推土机的FP延迟降低了1个周期,例如ffree
在没有As Agner Fog explains in his microarchitecture PDF或mulps
的情况下转发到addps
之间。
此外,各种AMD uarches在L1 I高速缓存中标记了指令边界,从而减少了重复解码的延迟。英特尔Silvermont也这样做。
我所看到的最先进的标记架构仍在开发中。它最初是由BAE系统在DARPA资助下开发的,在“ CRASH-SAFE”项目下有许多重要而有趣的进展/论文:
sqrtps
[Crash-Safe项目结束后(〜2015年),Draper Industries选中了该项目,并将其变成“ Dover固有安全处理器”(xorps
)。在2017年,Draper诞生了https://web.archive.org/web/20191022221212/http://www.crash-safe.org/,该技术将继续以“ CoreGuard”的名义针对多种架构开发。我感兴趣的两个项目是:
这种方法背后的动机是安全性,一旦您意识到在安全领域可以“修复”多少安全性,就很难理解为什么您甚至会以其他方式制造计算机。但这不限于安全性-标签对于非常高级的数据类型化方法(例如“维度分析”或针对多维数组的不同维度的单独的索引变量类型)非常有用。