常量折叠
所谓的常量折叠,指在传统编译器做语法分析的过程中,如果一个表达式的所有的operands都是常量,那么在编译结束的时候,相当于直接用计算结果来代表计算表达式.
例子
如上图所示,在这个函数里面,实现了三个常量的乘法,那么在编译的过程中,直接用计算的结果来代替本来要用两个乘法指令表达的计算式.也就是用(101112)代替(abc).常量折叠的技术通常和常量传播(也就是分析占位符到底是个什么类型,如果是常量的话,把他的数值给替代了).
神经网络编译器的常量折叠
我们以简单的add-conv为例.左边是没有进行常量折叠的计算图,右边是进行常量折叠的结果.对于两个形状大小为(N,C,H,W)而言的四维常量Tensor来说,其Add的结果是一定的.所以我们可以把它合成一个常量放在编译器生成的最终的计算图里面.
这样做,首先我们不需要给Add这个节点分配额外的存储资源.在计算图执行的过程中,也不需要反复计算add这个操作,直接进行访问结果就好了.