我正在尝试找到TensorFlow的低级线性代数和矩阵算术运算符的源代码,以便在CPU上执行。例如,tf.add()
的实际实现在CPU上执行的位置在哪里?据我所知,大多数线性代数运算符实际上是由Eigen实现的,但我想知道具体的特征函数被调用。
我尝试从高级API进行追溯,但这很困难,因为在图表上放置操作符和TF运行时实际执行操作符之间有很多步骤。
答案 0 :(得分:2)
实现隐藏在一些元模板编程背后(对于Eigen来说并不罕见)。
TensorFlow中的每个操作都在某个时刻注册。 Add
已注册here和here。
REGISTER3(BinaryOp, GPU, "Add", functor::add, float, Eigen::half, double);
操作的实际实施基于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
是传入的Tensor-Scalars,Device
是GPU或CPU,Functor
是操作本身。其他线路仅用于执行广播。
向下滚动此文件并展开REGISTER3
宏,说明如何将参数从REGISTER3
传递到functor::BinaryFunctor<Device, Functor, ...>
。
你不能指望看到一些循环作为Eigen使用表达式进行懒惰评估和别名。特征 - “呼叫”在这里: