整个流水线大概是:Init Graph –>OptimizationPassRegistry和Grappler进行全图优化 –> 根据Device将Graph拆成 Partition –> GraphOptimizer优化Partition–>图执行. 同其他注册机制一样, OptimizationPassRegistry也使用的registry, registertion以及registerar等概念.
源码中, 使用REGISTER_OPTIMIZATION()
注册一个优化器, 具体实现如下
//core/common_runtime/optimization_registry.h #define REGISTER_OPTIMIZATION(grouping, phase, optimization) \ REGISTER_OPTIMIZATION_UNIQ_HELPER(__COUNTER__, grouping, phase, optimization) #define REGISTER_OPTIMIZATION_UNIQ_HELPER(ctr, grouping, phase, optimization) \ REGISTER_OPTIMIZATION_UNIQ(ctr, grouping, phase, optimization) #define REGISTER_OPTIMIZATION_UNIQ(ctr, grouping, phase, optimization) \ static ::tensorflow::optimization_registration::OptimizationPassRegistration \ register_optimization_##ctr( \ grouping, phase, \ ::std::unique_ptr<::tensorflow::GraphOptimizationPass>( \ new optimization()), \ #optimization)
-12-new了一个我们注册的optimization对象并用unique_ptr指向它, 这个unique_ptr就是registry管理的对象, 通过它间接管理相应的optimization. 注册的本质是返回一个静态的, 类型为'OptimazationPassRegistration'
的, 名为'register_optimization_##ctr'
的对象, 这里使用了C++预编译宏'__COUNTER__'
生成唯一变量名
下面是一个`OptimazationPassRegistration`对象的构造过程, 可以看出, 就是将我们构造的'register_optimization_##ctr
注册到全局的'global_optimization_registry'
.