热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

MSROM过程中的条件跳转指令?

如何解决《MSROM过程中的条件跳转指令?》经验,为你挑选了1个好方法。

这与这个问题有关

但是考虑一下,在现代的英特尔CPU上,SEC阶段是以微码实现的,这意味着将进行检查,从而使用烧入的密钥来验证PEI ACM上的签名。如果不匹配,则需要执行某些操作;如果不匹配,则需要执行其他操作。假定这是作为MSROM过程实现的,则必须有一种分支方式,但是鉴于MSROM指令没有RIP。

通常,当一个分支错误地预测到将要采取的指令然后退出时,ROB将检查异常代码,并因此将指令长度添加到ROB行的RIP或仅使用下一个ROB条目的IP,这将导致前端在分支预测更新中恢复到该地址。有了BOB,此功能现在已借给跳转执行单元。显然,这与MSROM例程不可能发生,因为前端与此无关。

我的想法是,有一条特定的跳转指令,只有MSROM例程才能发出,它会跳转到MSROM中的其他位置,并且可以进行配置,以便始终预测不采用MSROM分支指令,并且在分支执行单元遇到此指令时指令并执行分支,它会产生异常代码,并可能将特殊的跳转目标连接到它,并且在退出时会发生异常。另外,执行单元可以处理它,并且可以使用BOB,但我的印象是BOB由分支指令RIP索引,然后还存在这样一个事实,即通常会在退休时处理生成MSROM代码的异常。分支错误预测不需要我不认为的MSROM,而是所有操作都在内部执行。



1> Peter Cordes..:

微代码分支显然很特殊。

根据安迪·格莱夫(Andy Glew)对原始P6的描述,英特尔的P6和SnB系列不支持微代码分支的动态预测(REP有什么设置?)。鉴于SnB-family-string rep指令的性能相似,我认为此PPro事实甚至适用于最新的Skylake / CoffeeLake CPU 1

但是,对微码分支的错误预测有一个惩罚,因此它们是静态预测的。(这就是为什么rep movsb对于ECX中的低/中/高计数,启动成本以5个周期为增量进行调整,以及对齐与未对齐的原因。)


微码指令在uop缓存中占据了整行。 当它到达IDQ的最前面时,它将接管发出/重命名阶段,直到完成发出微代码联动为止。 (有关更多详细信息,另请参见如何在指令周期内执行微代码?以及一些类似perf事件描述的证据idq.dsb_uops表明,IDQ可以从uop缓存中接受新的uops,问题/重命名阶段正在从微码序列器中读取数据)

对于rep-string指令,我认为循环的每次迭代都必须在前端实际发出,而不仅仅是后端内部循环并重用这些微指令。因此,这涉及来自OoO后端的反馈,以找出指令何时完成执行。

我不知道当问题/重命名切换到从MS-ROM而不是IDQ读取uops时会发生什么的细节。

即使每个uop都没有自己的RIP(属于单个微代码指令),但我猜想分支错误预测检测机制的工作原理与普通分支类似。

rep movs某些情况下,某些CPU上的设置时间似乎以5个周期为步长(小与大,对齐等)。如果这些是来自微码分支的错误预测,则这似乎意味着该错误预测惩罚是固定数量的循环,除非这是的特殊情况rep movs。可能是因为OoO后端可以跟上前端吗?从MS-ROM读取比从uop缓存读取甚至更能缩短路径,从而降低了丢失率。

对一些可能的OoO执行程序进行实验rep movsb(例如,使用两条相关的imul指令链),以查看它是否(部分)像它们那样对它们进行序列化lfence将是很有趣的。我们希望不是,但是要实现ILP,imul必须在不等待后端耗尽的情况下发出以后的命令。

我在Skylake(i7-6700k)上进行了一些实验。初步结果:95字节及更少字节的副本大小便宜,并且被IMUL链的延迟所掩盖,但它们基本上完全重叠。 96字节或更多字节的副本大小会耗尽RS,从而将两个IMUL链串行化。 不论是rep movsbRCX = 95 vs. 96还是rep movsdRCX = 23 vs. 24都是无关紧要的。如果我有时间,我会发布更多详细信息。

测量了“使RS吸水”的行为,rs_events.empty_end:u偶数变为1 / rep movsb而不是〜0.003。 other_assists.any:u为零,因此它不是“助手”,或者至少不算作1。

如果微代码分支不支持通过BoB进行快速恢复,也许涉及的任何uop只会在退休时检测到错误的预测?96字节阈值可能是某些替代策略的临界点。RCX = 0也会耗尽RS,大概是因为这也是一种特殊情况。

测试会很有趣rep scas(它不支持快速字符串,只是慢而笨拙的微代码。)

英特尔1994年的Fast Strings专利描述了P6中的实现。它没有IDQ(因此在阶段之间确实具有缓冲区和uop缓存的现代CPU会有一些变化是很有意义的),但是它们描述的避免分支的机制很简洁,也许仍然用于现代ERMSB:第一次n复制迭代是针对后端的uops谓词,因此可以无条件地发出它们。还有一个uop会导致后端将其ECX值发送到微码定序器,该定序器将在此之后正确地输入正确数量的额外副本迭代。仅是副本代码(可能是ESI,EDI和ECX的更新,或者可能仅在中断或异常时执行),而不是微代码分支代码。

n读取RCX后,最初的oups与更多输入可能是我所看到的96字节阈值。idq.ms_switches:urep movsb增加一个(从4到5)。

https://eprint.iacr.org/2016/086.pdf建议微码在某些情况下可以触发辅助,这可能是复制较大尺寸文件的现代机制,并且可以解释耗尽RS(显然是ROB)的原因,因为它仅在提交(退出)uop时触发,因此就像没有快速恢复的分支一样。

执行单元可以通过将事件代码与微操作的结果相关联来发出帮助或发出故障信号。提交微操作(第2.10节)时,事件代码使乱序调度程序挤压ROB中所有进行中的微操作。事件代码被转发到微码定序器,后者在相应的事件处理程序中读取微操作”

此专利与P6专利之间的区别在于,这种辅助请求可以在以后的指令中已发出一些非微码指令之后发生,这是因为预期只有第一批指令才能完成微码指令。或者,如果它不是微代码批处理中的最后一个uop,它可以像分支一样用于选择其他策略。

但这就是为什么它必须刷新ROB的原因。

我对P6专利的印象是,对MS的反馈发生在以后的指令发出uops之前,如果需要,可以及时发布更多的MS uops。如果我错了,那么也许它已经是2016年论文中描述的相同机制。


通常,当分支错误地预测为采用该指令时,则当指令退出时

自Nehalem以来,英特尔就拥有了“快速恢复”的能力,它在执行错误的分支时开始恢复,而不是像异常情况一样等待它退休。

这是在通常的ROB退出状态之上设置一个Branch-Order-Buffer的要点,当任何其他类型的意外事件成为非推测性事件时,它可使您回滚。(当Skylake CPU错误预测分支时会发生什么?)


脚注1:IceLake应该具有“快速简短表示”功能,这可能是处理rep字符串的另一种机制,而不是更改微码。例如,也许像安迪(Andy)这样的硬件状态机提到他希望自己首先设计出来。

我没有任何有关性能特征的信息,但是一旦我们知道了一些信息,我们便可以对新的实现方式做出一些猜测。


推荐阅读
  • 本文基于《Core Java Volume 2》的内容,深入探讨了网络编程中通过POST方法提交表单数据的技术细节,包括GET与POST方法的区别、POST提交的具体步骤及常见问题处理。 ... [详细]
  • ANSI最全介绍linux终端字体改变颜色等ANSI转义序列维基百科,自由的百科全书由于国内不能访问wiki而且国内关于ANSI的介绍都是简短的不能达到,不够完整所以转wiki到此 ... [详细]
  • 本文将深入探讨 Unreal Engine 4 (UE4) 中的距离场技术,包括其原理、实现细节以及在渲染中的应用。距离场技术在现代游戏引擎中用于提高光照和阴影的效果,尤其是在处理复杂几何形状时。文章将结合具体代码示例,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 本文详细探讨了在Python开发中遇到的ImportError: 无法找到名为Crypto.Cipher的模块的问题,并提供了多种解决方案,包括环境配置、库安装和代码调整等方法。 ... [详细]
  • Python安全实践:Web安全与SQL注入防御
    本文旨在介绍Web安全的基础知识,特别是如何使用Python和相关工具来识别和防止SQL注入攻击。通过实际案例分析,帮助读者理解SQL注入的危害,并掌握有效的防御策略。 ... [详细]
  • 作为一名CSS初学者,我在博客园中尝试通过CSS美化页面,特别是为超链接添加图标,以提升阅读体验。本文将分享如何使用CSS和字体图标库来实现这一功能。 ... [详细]
  • 本文详细介绍了在 Windows 7 上安装和配置 PHP 5.4 的 Memcached 分布式缓存系统的方法,旨在减少数据库的频繁访问,提高应用程序的响应速度。 ... [详细]
  • 构建Python自助式数据查询系统
    在现代数据密集型环境中,业务团队频繁需要从数据库中提取特定信息。为了提高效率并减少IT部门的工作负担,本文探讨了一种利用Python语言实现的自助数据查询工具的设计与实现。 ... [详细]
  • 视觉Transformer综述
    本文综述了视觉Transformer在计算机视觉领域的应用,从原始Transformer出发,详细介绍了其在图像分类、目标检测和图像分割等任务中的最新进展。文章不仅涵盖了基础的Transformer架构,还深入探讨了各类增强版Transformer模型的设计思路和技术细节。 ... [详细]
  • KNN算法在海伦约会预测中的应用
    本文介绍如何使用KNN算法进行海伦约会的预测。我们将从数据导入、数据预处理、数据可视化到最终的模型训练和测试进行全面解析。 ... [详细]
  • 本文详细介绍了中心方形数的概念及其计算方法,并提供了多种编程语言下的实现代码。 ... [详细]
  • 深入解析ASP.NET中的HttpHandler、HttpModule与IHttpHandlerFactory
    本文探讨了ASP.NET页面生命周期中的关键组件——HttpHandler、HttpModule和IHttpHandlerFactory的工作原理及其应用场景。通过实例分析,帮助读者更好地理解和利用这些组件来优化Web应用程序。 ... [详细]
  • QLab Pro如何对工作区进行设置
    QLabMac是一款Mac平台的音频编辑处理工具,用户可对WAV、MP3、MP2、MPEG、OGG、AVI、g721、g723、g726、vox、ram、pcm、wm ... [详细]
  • Linux系统中高效解决高Buff/Cache占用问题
    本文详细探讨了在Linux系统中遇到的高Buff/Cache占用问题及其解决方案,提供了手动清除与定时任务自动化处理的方法。 ... [详细]
  • 运用DDD分层架构优化微服务代码设计
    在微服务实施过程中,确定合理的代码结构至关重要。本文探讨了如何利用领域驱动设计(DDD)的分层架构来优化微服务的代码模型,确保系统的可维护性和扩展性。 ... [详细]
author-avatar
花琦1979
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有