國
立 政 治 大 學
‧
N a tio na
l C h engchi U ni ve rs it y
圖4-14 各運算子的level 關係圖
從圖 4-14 我們可以看到抽象語法樹在執行分配律時的最小單位,x*F1 和 x*F2 兩個 term 在提出 x 後會成為右方 x*(F1+F2)的型態。而中間的表則代 表*1、*2 會因為 level 的不同影響*3 的 level,最後導致整體 smc 運算耗費 的變化。四個組合只有在*1 和*2 都是 local 運算子時,*3 的 level 才能為 local,其他組合因為至少有一個*為 shared 使得 swap 後的*3 必須為 shared。
而在*3為 shared 的狀況下,只有*1 和*2 皆為 shared 運算子才能保證此 次 swap,因為兩個*共用一個*而使 smc 運算耗費減少。既然*1 和*2 必須 為 shared 運算子才有提出 x 的價值,在提出後的 F1 和 F2 少了*1 和*2 跟原 本相比會耗費更少 smc。編譯器也可以從提出 x 後 term 的運算耗費變化,逆推 回去得知這次的 swap 是否能讓*被共用而省下運算耗費。
4-10 分析 B:將 term 往同類聚集使加法 local 化
在分析 A 的步驟處理完畢後,原本不包含 x 的 terms 會和沒有被納入分 配律的 shared term 合為 outer terms,被採用的 shared terms 將會提出 x,剩 下在括號內的部分稱為 inner terms。接下來分析 B 的步驟是針對 private terms,
由於 private terms 本身是 local 耗費為 0,不管怎麼 swap 運算子皆無法再減少 運算耗費,所以我們把目標從 term 內的乘號轉移到 term 前的加號上。如圖
4-40
‧ 國
立 政 治 大 學
‧
N a tio na
l C h engchi U ni ve rs it y
16 中 x*F2 因為是 private term,使得*2 是 local 運算。而 x*F2 外的+1 要將 shared 的*1 和 local 的*2 相加必須為 shared 的加號,如何使+1 降為 local 的加號是分析 B 所關注的。
圖 4-15 將 outer terms 和 inner terms 在抽象語法樹中展開,x*F2 因為 含有 x 所以要決定是否提出 x 加入 inner terms。展開後的 outer terms 因為 rule1,依 level 會形成 ToA、ToB 和 ToS 三種群聚,群聚間用一個 shared 的 加號串聯。展開後的 inner terms 雖然提出了 x,但剩下的部分也能用 rule1 整 理成 TiA、TiB 和 TiS 三種群聚。x*F2 若能在 outer terms 找到所屬 party 的群 聚加入,+1 會因 rule1 把同類聚集而使加法 local 化。反之,若 x*F2 無法在該 邊找到所屬的群聚加入,硬要把它分配過去的結果就是另外產生新群聚,且必 須用 shared 的加號與舊群聚相連而無法將+1 降為 local。若要測試是否加入 inner terms 則要將 x 提出留下 F2,然後看 F2 是否能加入 inner terms 的任一 個群聚中。跟 outer term 不同在於,F2 有可能是像 a 提出 a 後變成 1 這種 public term,public term 可以視為 Alice 或 Bob 而任意加入這兩個群聚中。
圖4-15 以整個expression 的抽象語法樹看 Private term 歸屬
41
‧ 國
立 政 治 大 學
‧
N a tio na
l C h engchi U ni ve rs it y
在上面的分析之後,我們可以整理成 4-16 圖表來呈現 private term t 的 歸屬。表中 W(weak unknown)代表將 t 歸類到 outer 或 inner 都 don’t care。
遇到 don’t care 的狀況,目前編譯器的設計會傾向將 term 留在 outer,以減 少改變的 term 數簡化執行。Rule2 因為使用分配律,必須要兩個以上的 term 參與,所以當 inner term 只收集到一個以下的 terms 數,代表使用 rule2 無法 減少此 expression 的 smc 數量。
圖4-16 Private term t 加入 outer terms To或inner terms Ti
42