【TensorFlow源碼系列】【四】圖優化算法:constant folding和CSE 原

TensorFlow中使用的圖優化算法有:constant folding 和CSE(common-subexpression elimination)

【算法一】constant folding

該算法,是將graph中常量的計算合併起來。例如: C = A+B,其中A和B都是constant,比如 A= 2,B =3,則在使用C時,直接使用C =5,而不是使用C =2+3;因爲每使用一次C,如果都需要計算一次的話,則浪費了大量計算。

該算法的實現在 core/common_runtime/constant_folding.h 中的ConstantFold接口中。

借用 constant_folding_test.cc中的一個示例,可以說明constant folding想要做的事情。

其中a/b/c均是常量,則m1和m2也可以計算出是常量,則s1可以直接通過m1計算得到,而不用通過計算m1= a+b得到。這種常量算子合併算法,減少了不必要的重複計算量,提升了計算性能。

ConstantFold:
	// 1. 找出graph中的constant
	// 2. 將constant進行算子合併
	// 3. 使用合併後的算子替換掉原始graph中被合併的算子

【算法二】CSE,公共子表達式合併

舉個例子吧!

A = (B+C)*D + (B+C)*E;

如果B+C已經計算過了,值記爲W,即W = B+C,且計算A時,B和C均在上次計算後,至此次計算前均沒有發生變化,則A = W*D +W*E,即減少兩次B+C的計算。

其實,本來也是這個道理,我們計算時也會使用一箇中間變量tmp來存儲B+C的值,避免B+C計算兩次。在B和C都是高維矩陣時,這種方案的節省計算帶來的性能提升還是比較明顯的。

該算法的實現在 core/graph/optimizer_cse.h

接口爲:OptimizeCSE

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章