# Original # int i, w, x[1000], y[1000]; # for (i = 0; i < 1000; i++) { # x[i] = x[i] + y[i]; # if (w) # y[i] = 0; # } # #---------------------------------- # Loop unswitching # # int i, w, x[1000], y[1000]; # if (w) { # for (i = 0; i < 1000; i++) { # x[i] = x[i] + y[i]; # y[i] = 0; # } # } else { # for (i = 0; i < 1000; i++) { # x[i] = x[i] + y[i]; # } # } 1.可確保在for loop 中的 lp_body 是 clean 的, 表示在 lp_body 中,只有 DFG 的 (BasicBlock)BB, 可避免不必要的條件中斷(Branch). 2.可透過 struct 的分析,把 for loop 當成個 node, 可以簡化成 sample BB with CFG control. 之後利用 BDD (Binary decision diagram) 的方式做出每個 Output condition 的機率, 有利於 compiler 做 branch jump 的 predict x1,x2,x3,Y --------- [0,0,0] = 0 [0,0,1] = 0 [0,1,0] = 1 [0,1,1] = 1 [1,0,0] = 1 [1,0,1] = 1 [1,1,0] = 1 [1,1,1] = 0 @ y = 0 prb(3/8) @ y = 1 prb(5/8) <= predict better 3. key notes 判斷 condition branch 是否 stable, 會不會在 for loop 內改變狀態, 如果是 stable 才做 Loop unswitching
2011年8月23日 星期二
Loop unswitching
訂閱:
張貼留言 (Atom)
沒有留言:
張貼留言