现在的位置: 首页 > 综合 > 正文

关于NVIDIA OpenCL/CUDA Best Practice里一段话的思考

2013年10月14日 ⁄ 综合 ⁄ 共 1051字 ⁄ 字号 评论关闭

The compiler replaces a branch instruction with predicated instructions only if the number of instructions controlled by the branch condition is less than or equal to a certain threshold: If the compiler determines that the condition is likely to produce many divergent warps, this threshold is 7; otherwise it is 4.

 

字面意思:在由分支条件控制的指令数目小于等于某个阈值的情况下,编译器会自动使用谓词指令替换分支指令。如果编译器认为某个条件有可能造成很多存在分支的warp,那么阈值是7,否则是阈值是4

 

我比较好奇,第二句话“如果…,那么…”的逻辑关系为什么会成立?!编译器认为控制语句的判断条件可能造成大量warp的分支,然后阈值就是7;而如果造成少量warp的分支,阈值就小了,变为4,这是为何呀?我是这么分析地,错误或不当之处敬请指出。

 

樟树曰过,谓词执行要执行所有分支的,所以如果执行所有分支的代价比等待判断分支结果的代价大,那就不用了。这句话很好很强大!如果编译器可以判断出:

1.        大部分warp都会分支:

if(tid%32 == 1) {} else {} 

比如这种情况,每个warp都会分支,没有哪条路径是“常”被走地,那么编译器就得在“判断控制”与“谓词方法”中做一权衡,花括号里包含的指令<=7条时,谓词方法具有优势(我觉这一数字应是实验推出来的)

2.        少部分warp会分支:

if(tid>=16) {} else {} 

比如这种情况下,只有一个warp会分支,其它warp都不会。换句话说,其它warp都常光顾else分支,那编译器自然倾向于“判断控制”的手段,而不大愿意低着头连if也走了,除非花括号里的指令特别特别少(这里是<=4),使得 “谓词方法”也凑合可以用或者更加节时,只有这种情况下编译器才默认采用谓词方法。

 

于是47小就基本得到了解释。当然这并不是严谨的证明,如果要做出完备性证明还必须考虑到if/switch的各种情况,呵呵,小女不才就免了这桩吧。对于我来说,只知道4为什么小于7就够了,至于47两个数字精不精确,那得实验和具体应用说了算,,NV也只是给了个参考值而已。不用较真啦,保留点雅致看看窗外云卷云舒吧~~呵呵

抱歉!评论已关闭.