c - 重新排序如何消除反向循环携带依赖
问题描述
给定以下代码,存在向后依赖。
for(int i=0; i<n; i++) {
(S1): d[i] = a[i-1] * d[i];
(S2): a[i] = b[i] + c[i];
}
我的问题是如何定义/识别这些向后依赖。因为我真的找不到自己的计划来做到这一点。
这就是我目前解决这个问题的方式:在这个例子S1 has a anti-dependency on S2
中,S1 首先读取并且 S2 写入变量。
进一步我们学会了创建一个方向向量:
Iteration: read: write
v1:
S1(9) a[8]
S2(9) - a[9]
v2:
S1(10) a[9] -
S2(10) - a[10]
这将导致方向矢量 D_v:D_v = v2 - v1 = (i - 1) - i = -1 = >
现在解决方案是重新排序语句,这是可能的,因为 S1 和 S2 在循环中没有依赖关系。
for(int i=0; i<n; i++) {
(S1): a[i] = b[i] + c[i];
(S2): d[i] = a[i-1] * d[i];
}
这将导致S1 has a true-dependency on S2
S1 首先写入而 S2 读取变量。如果我重复创建方向向量:
Iteration: read: write
v1:
S1(9) - a[9]
S2(9) a[8] -
v2:
S1(10) - a[10]
S2(10) a[9] -
现在将导致方向向量D_v: D_v = v2 - v1 = (i + 1) - i = +1 = <
现在的方向向量是< instead of > (or +1 instead of -1)
但我只是没有看到方向向量和向后依赖之间的联系?这是纯粹的< or > ?
吗?有人可以澄清如何识别向后依赖关系以及为什么重新排序不再是向后依赖关系(在这个例子中充其量)?从我的角度来看,我们仍然依赖于循环的最后一次迭代。但是我的资源(讲座)说这不再是向后依赖,我们可以向量化循环。
解决方案
推荐阅读
- arrays - 将数组的每个元素作为菜单分别添加到 DIALOG 命令中
- java - 用 maven-shade-plugin 替换/删除原始 jar
- python-3.x - “AssertionError:找不到需要填充的字段;我们很惊讶您收到此错误,请在 github 上打开一个问题”错误发生
- hibernate - 具有多租户问题的 Hibernate Search 6,HSEARCH000520,HSEARCH600029
- c++ - 为什么我收到未在此范围内声明的错误?
- regex - 正则表达式抓住一个词
- tfs - TFS246017:Team Foundation Server 无法连接到数据库
- mysql - MySQL存储过程涉及事务时的调试策略
- javascript - 我想使用其中的删除按钮从动态 div 中删除项目
- vue.js - 在 vue 3 中查看父组件的子属性