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

重新排序指令如何解决数据依赖关系?

酆华皓
2023-03-14

我最近遇到了一个问题。我看了一段关于数据依赖性的视频。讲师说,通过对指令重新排序,可以解决数据依赖性问题。写入后读取危险示例:

A1 <- B1 + C1 
A2 <- A1 + B2 

在这种情况下,第二条指令有两个档位。通过重新排序指令:

A2 <- A1 + B2 
A1 <- B1 + C1 

我们消除了先读后写的危险。从技术上讲,这是正确的。但是,我想知道,第二种方法是否在逻辑上是错误的,并且会引入错误的结果?

如果我错了,请纠正我,因为我是新手。

共有1个答案

朱保赫
2023-03-14

你是对的,这将改变结果,并且不是有效的优化,除非您有其他信息以某种方式使其安全。(即A已经等于B1 C1,在这种情况下,您应该直接优化它而不是重新排序)。

(我假设“A”是寄存器,A1/A2是跟踪值生命周期的静态单一分配方式的序列号。即A2是A的第二个值。)

希望您正在观看的视频没有表明这是解决第一个案例问题的方法,只是这是一个没有问题的不同示例。

 类似资料:
  • 我在读OOOE(无序执行)以及如何解决虚假依赖关系(通过使用重命名)。 但我的问题是,我们如何解决真正的依赖关系(RAW-写后读)? 例如: 如果CPU选择在#1之前运行#2,则重命名在此处没有帮助。

  • 问题内容: 我只是碰到一篇文章,声称我从未听过,也找不到其他地方。声称是从另一个线程的角度来看,可以根据构造函数内部的指令对构造函数返回的值的分配进行重新排序。换句话说,声称是在下面的代码中,另一个线程可以读取其中未设置的非空值。 这是真的? 编辑: 我认为从线程执行的角度来看,可以保证的分配与的分配具有先发生后关系。但是,这两个值都可能缓存在寄存器中,并且可能未按照最初写入的顺序将它们刷新到主存

  • 变量res的值应等于3。但是当我打开优化时,编译器错误地重新排列了指令,并且res包含一些垃圾。一些可能的重新排序示例: 这是编译器中的错误吗?还是不允许像这样访问结构数据成员? 编辑: 我刚刚意识到之前的代码实际上有效,抱歉。但这不起作用: 当编译时不知道变量i时,编译器会错误地重新排序指令。

  • 检查AAR元数据值时发现一个或多个问题: 依赖项的AAR元数据(META-INF/com/android/build/gradle/aar-metadata.properties)中指定的minCompileSdk(31)大于此模块的compileSdkVersion(android-30)。依赖项:androidx.appcompat: appcompat: 1.4.0。AAR元数据文件:C:\

  • 我正在开发一个Android库。该库几乎没有依赖关系。我不确定如果开发人员将我的库与我的库中已经存在的其他依赖项一起使用会发生什么。我试着搜索这个,但什么也找不到。 例如,我在我的库中使用version X的Volley库,并将其作为gradle包发送。开发人员将Version Y和我的库一起导入Volley。 在库(模块、jar或包)中包含依赖项的最佳方式是什么,以最大限度地减少冲突情况。