On Predicated Execution
目的:由于 GPU 属于 SIMD 架构,也就是单指令多数据,当一堆数据
过来时,不一定同时跳转,因此这里通过预测寄存器来控制,也就是
通过 If-Conversion 算法消除所有的跳转指令,这样带来的好处就
是,将控制依赖转换为数据依赖,同时增大了 Basic Block 的大小,
为有利于后面的指令调度。
这个算法其实很简单,我们可以这么理解:
1) 每个 Basic Block 都要有一个 PRF 去控制当前的 Block 是否被
执行,这里的控制,我们可以理解为,每个 Block 需要 Use 一个
PRF 去控制当前 Block(假定 BB2 用 P2 去控制,那么 BB2 的所有
的指令都会用 P2 去 guard)。
2) 既然需要一个 PRF,那么这个 PRF 应该在哪里 define 比较好呢?
对 1)来说就是考虑为每个 Block 分配哪个 PRF 去控制 Block,也就
是论文中的 p = R(x)算法,这里的 x 指某一个 Block,p 指某一个
PRF,比如上面提到的 R(BB2) = p2;
对 2)来说就是考虑每个 Block 中用的 PRF 应该在哪里去定义呢,也
就是论文中的 K(p) = {BB, BB…},还是上面的那个例子,假定 p2
在 BB1 和 BB3 中定义,那么 K(p) = {BB1, BB3};
简单介绍了上面的算法后,首先要了解一个概念,即控制依赖,
control dependency.我们需要明白的是,关于控制依赖的算法已
经存在了,并不是在这里发明的,我们看看控制依赖的定义:
A node (basic block) Y is control-dependent on
another X iff
X determines whether Y executes, i.e.
• there exists a path from X to Y s.t. every node
in the path
other than X & Y is post-dominated by Y
• X is not post-dominated by Y
//参考 ControlDependence.pdf
从上面的定义我们看到,其实在论文中讲到的算 CD(t)就是来自于控
制依赖的定义而已。控制依赖就解决了在哪定义的问题,也就是上面
说到的 K 算法。
我们下面说说论文中的几个结论:
RK function:
1) x≈y if CD(x)=CD(y)
//如果 Block x 和 y,都同时控制依赖一个集合,那么 x≈y,约