• 沒有找到結果。

立 政 治 大 學

N a tio na

l C h engchi U ni ve rs it y

圖4-6 左元素和右元素所屬party 與相連二元運算子關係表

除了所有運算的權重先預設為1 外,smcSL 在確保資訊不外漏是採取最 保守的設計,讓shared 變數與 public 變數運算產生的結果為 shared。而目前 SMC 函式庫的設計,shared 變數與 public 變數的運算可以各自在分持的 local 端 完成,不需要為運算結果產生shared 變數才能保密。而 smcSL 採用保守設計的 原因是,就算之後SMC 函式庫改版使內部運算方式有所改變,使用者也不用擔 心 smcSL 會因此而洩漏資訊。保密上的可靠性帶來的副作用就是效能上的損失,

更多的shared 運算因此產生,而 cost calculation 也會將這些運算耗費忠實地記 錄下來以供後續優化程序參考。

4-4 Expression Normalization

有了可估算的機制後,會先記錄原本未優化的expression 所消耗的運算 數,以此為標準來跟改寫後的抽象語法樹做比較。接著編譯器會將expression 正規化成如圖4-7 的例子,目的是消去其中的括號和減號。正規化後的抽象語 法樹因為不會有括號影響優先度,乘號和負號組合的子樹會自成一個term 並互 相以加號為root 相連,方便之後優化時交換律和分配律的運作。而減號部分有

的性質而無法交換,但將減法符號改成負數便可以使用交換 律,使正規化後的expression 符合優化的條件。

acc1 ^ acc2

30

‧ 國

立 政 治 大 學

N a tio na

l C h engchi U ni ve rs it y

圖4-7 抽象語法樹正規化後的範例,term 子樹以加號為 root 串連

抽象語法樹正規化要經過下面三步驟:

1. 將所有 Sub 的運算子改寫成 add 為 root,右子樹為 neg。

2. 消去減號後將 unary 的符號 neg 往下沉至最接近 leaf 處,代表最高的 運算優先權。

3. 用分配律將所有括號相乘展開,讓 mul 為根(root)的子樹必不會出現 優先權比他低的add 節點。

正規化後的expression 會如圖 4-8 的規則呈現,E 代表 expression,由很 多T(term)用+相連,T 則是由很多 F(Factor)以*組成,Factor 可能會接上-(負 號)代表負數,最後一層則代換成 A(atomic 運算元)是變數 id 或是常數。

31

‧ 國

立 政 治 大 學

N a tio na

l C h engchi U ni ve rs it y

圖4-8 抽象語法樹正規化後的規則

在正規化的過程中,因為term 是一連串運算元的連乘,所以我們可以利 用負負得正的原理,去減少每個term 內部的負號。若 term 中的負號數為偶數 則可以完全消去,若為奇數則在兩兩對消後留下一個負號。這過程除了讓抽象 語法樹更簡化外,更能省下SMC 運算。如式 4-1,a 代表屬於 Alice 的變數,s 代表shared 變數。正規化會先將減法用負號代替,並把括號外面的負號配至每 個運算元前以消除括號,使得正規化後的expression 會有編號 1,2 兩個 terms。

其中term 2 的負號遇上了 shared 變數,在 SMC protocol 中必須產生 smc_neg 來做安全運算,使得runtime 時要多花時間處理這個算式。但若有去消負號,

term 1 有奇數個負號所以留下一個,而 term 2 有偶數個負號,可以直接對消,

使得處理shared 變數時不用另外呼叫 smc_neg。

式4-1 代換減法及消去負號

32

‧ 國

立 政 治 大 學

N a tio na

l C h engchi U ni ve rs it y

相關文件