Bazel编译TensorFlow源码时tf_kernel_library与cc_library的区别
tf_kernel_library 与 cc_library 的核心差异 二者最本质的区别是:cc_library是Bazel原生提供的通用C++库构建规则,而tf_kernel_library是TensorFlow项目自定义的封装宏,专门服务于TF算子内核的编译场景,底层最终还是会生成cc_library目标,但自动预置了大量TF内核开发所需的专属配置。
具体差异可以拆成几个维度:
- 依赖注入逻辑不同
原生cc_library不会自动附加任何项目专属依赖,所有依赖项都需要开发者手动在deps字段声明。tf_kernel_library会默认注入TF内核编译必需的基础依赖,包括算子基类、张量操作工具集、设备抽象层接口等通用依赖,不需要开发者重复配置。 - 多设备编译适配不同
cc_library只处理通用C++代码的编译,不会识别TF特有的多设备编译逻辑。tf_kernel_library会根据全局编译配置,自动适配CPU、GPU等不同设备的编译流程:比如自动识别后缀为.cu.cc的CUDA核函数代码、触发对应设备的编译工具链、追加设备相关的编译宏,生成对应架构的目标文件。 - 内核注册逻辑处理不同
用cc_library编写的内核代码,很容易因为链接顺序、依赖缺失问题,导致内核注册逻辑没有被正确链入最终二进制,运行时出现"找不到对应算子内核"的错误。tf_kernel_library会自动处理注册相关的链接配置,保证内核实现能正确注册到TF的全局内核注册表中。 - 编译选项对齐不同
cc_library默认使用Bazel通用C++编译选项,不会自动对齐TF项目的全局编译要求。tf_kernel_library会自动继承TF全局的编译配置,包括警告等级、异常开关、版本宏定义、不同编译场景(服务端/移动端、调试/发布)下的代码裁剪规则,避免手动配置导致的编译选项不兼容问题。
场景选择参考
- 编写算子内核实现、设备绑定相关的核心逻辑时,优先用
tf_kernel_library,减少重复配置成本- 编写内核依赖的纯C++通用工具类、和设备注册/内核注册逻辑无关的辅助代码时,用原生
cc_library即可,避免引入不必要的依赖拖慢编译速度
内容的提问来源于stack exchange,提问作者kingwales
相关产品推荐
相关产品推荐

