tensorflow - TensorFlow 算子源代码
问题描述
我正在尝试查找 TensorFlow 的低级线性代数和矩阵算术运算符的源代码,以便在 CPU 上执行。例如,在tf.add()
CPU 上执行的实际实现在哪里?据我所知,大多数线性代数运算符实际上是由 Eigen 实现的,但我想知道具体调用了哪些 Eigen 函数。
我尝试从高级 API 进行追溯,但这很困难,因为在将运算符放置在图形上与 TF 运行时实际执行运算符之间有很多步骤。
解决方案
该实现隐藏在一些元模板编程之后(对于 Eigen 来说并不罕见)。
TensorFlow 中的每个操作都在某个时间点注册。在这里和这里Add
注册。
REGISTER3(BinaryOp, GPU, "Add", functor::add, float, Eigen::half, double);
Operations 的实际实现是基于OpKernel
. 该Add
操作在BinaryOp::Compute
类层次结构中实现BinaryOp : BinaryOpShared : OpKernel
在添加两个标量的情况下,整个实现只是:
functor::BinaryFunctor<Device, Functor, 1>().Right(
eigen_device, out_flat, in0.template flat<Tin>(),
in1.template scalar<Tin>(), error_ptr);
in0, in1
传入的张量标量在哪里,Device
是 GPU 还是 CPU,Functor
是操作本身。其他行仅用于执行广播。
在此文件中向下滚动并展开REGISTER3
宏说明如何将参数从 传递REGISTER3
到functor::BinaryFunctor<Device, Functor, ...>
。
您不能期望看到一些循环,因为 Eigen 使用表达式进行惰性求值和混叠。Eigen-“呼叫”在这里:
推荐阅读
- ios - 我可以在 UISwitch 中设置描述值吗?
- c# - C#:如何找到 2 个可为空的日期时间之间的天数差异?
- angular - IIS7 上的 Angular 7 应用程序中的 500(URL 重写模块错误。)
- regex - XML 正则表达式,用于在输入字符串中排除名为“County”的单词,并且可以接受任何单词/数字/空格
- python - 如何使用 Sympy 自动简化二值有限域上的表达式?
- jquery - 如何通过类名查找元素的父级并添加 CSS?
- swift - 如何隐藏像example.app这样的包文件?
- vbscript - WScript 不适用于 HPALM 工作流程。但是在命令行中执行时工作正常
- unity3d - unity 2019 如何添加 NetworkManager 组件
- reactjs - 绑定一个 props 函数