当前位置: 首页 > 知识库问答 >
问题:

什么是 CPU 中的错误依赖关系?

廉博赡
2023-03-14

有人能帮我理解一下“假性依赖”是什么意思吗?

我的教授刚刚在这张幻灯片中解释了为什么我们不能在命令1之前运行命令3,但为什么后来他称之为“假”?

共有1个答案

田修为
2023-03-14

它是“假”的,因为后面的指令实际上不需要前面指令的数据。唯一的冲突是找到一个放置结果的地方。就像幻灯片上说的,“不是真正的数据依赖”;只有战争风险才是真正的依赖。

如果CPU发明了一个临时位置来放置结果,直到架构寄存器可用,它可以独立执行后面的指令。必须等待这个寄存器准备好是可以避免的,因此它不是真正的依赖,它是错误的。

寄存器重命名通常避免了WAR和WAW危险,但CPU将指令视为具有来自寄存器的输入的特殊情况除外,即使结果不依赖于其中的任何位。

尽管您的幻灯片不是x86 asm,但您标记了[intel],因此您可能更喜欢x86示例:

  • 为什么在哈斯韦尔身上乳霜只需要3个周期,这与阿格纳的指令表不同?(使用多个累加器展开FP循环) - 使用像movss这样的只写指令写入相同的寄存器,打破了对先前值的依赖,因为执行OoO exec的x86 CPU也执行寄存器重命名。在矢量点积中保持多个 vfmadd 指令的一种方法是使用多个寄存器来保存总和。
  • 为什么打破 LZCNT 的“输出依赖性”很重要? - lzcnt eax,edx 对于 EAX 应该是只写的,但是英特尔·哈斯韦尔和布罗德韦尔有一个错误的输出依赖性,像 bsr eax 一样调度它,在 EDX 为零的情况下读取 EAX。
  • 将 32 位环路计数器替换为 64 位会带来疯狂的性能偏差,英特尔 CPU 上_mm_popcnt_u64相同的问题,但对于 popcnt、假(输出)依赖桑迪布里奇家族,直到 Ice Lake。有趣的是,它运行在与 lzcnt / bsr / tzcnt / bsf 相同的执行单元上。
  • 为什么GCC不使用部分寄存器? - 在许多微体系结构上写入部分寄存器算作完整寄存器的读取 - 修改 - 写入,例如mov di,123被安排为添加edi,123,不像mov到32或64位寄存器,它们都覆盖整个寄存器以避免错误的依赖关系,而不会进行混乱的部分寄存器重命名。
  • 在英特尔桑迪布里奇家族 CPU 中取消优化管道程序 - WAW 和 WAR 错误依赖项不会在 SnB 系列上停止,也不会独立写入同一内存位置。
 类似资料:
  • 我编写了一个TimerHelper类,它可以接收来自其他类的调用并尝试执行它们。如果发生异常,它将等待一段时间并重试。因此,其他类可以导出必须完成的任务,但不是目前必须完成的任务。 14:56:19,125错误[org.jboss.MSC.service.fail](MSC服务线程1-7)MSC000001:未能启动服务jboss.deployment.unit.“usermanagement.w

  • 在学习gradle时,我似乎是Java的构建工具。但我不明白依赖到底是什么。Gradle中的依赖项部分到底是什么意思?它有什么用途?

  • 我正在尝试运行一些Android测试,然而,编译器抱怨多个dex文件存在。 因此,我正在尝试筛选重复的依赖项: 然而,我得到以下输出: 我不明白箭头(->)的意思。他们是什么意思?

  • 问题内容: 已经发布了几个问题,其中包括有关依赖项注入的特定问题,例如何时使用它以及支持它的框架。然而, 什么是依赖项注入?何时/为什么/不应该使用它? 问题答案: 依赖注入 将依赖传递给其他 对象 或 框架 (依赖注入器)。 依赖注入使测试更加容易。注入可以通过 构造函数 完成。 其构造函数如下: 问题 :如果涉及复杂的任务,例如磁盘访问或网络访问,则 很难 对其进行单元测试。程序员必须进行模拟

  • 问题内容: 我有一个依赖关系如下: 当我部署一切正常时,这将拉下另一个引发ClassDefNotFound的依赖项。 我添加了两个依赖项,如下所示: 并且仍然面临着同样的问题,即:MVN带来下来不 我该如何解决? 编辑: 添加; 问题答案: 您可能有一个传递依赖项,另一个依赖项取决于您不需要的版本。 要获得所有直接和传递依赖关系的概述,请尝试: mvn依赖项:树 如果您发现同一依赖项的不同版本之间

  • 问题内容: 我有一个二进制文件,其中ldd显示了意外的依赖项和libicuuc(来自“ icu”)。 由于在该系统上libxml动态依赖于libicuuc,因此ldd最终会找到它是有意义的,但是是否期望libicuuc也出现在A的ldd输出中?是否有一些命令仅检索链接为依赖项依赖关系的库? 问题答案: 显示启动应用程序或加载共享库时需要加载的所有库。 仅显示二进制文件的直接依赖项。 是否有一些命令