本文参考https://www.tensorflow.org/install/source
下载Tensorflow源码:
git clone https://github.com/tensorflow/tensorflow.git
下载完成后,可以看到,tensorflow目录结构如下:
maliankang@AwExdroid112:~/tensorflow$ tree -L 2 -d
.
├── tensorflow
│ ├── c
│ ├── cc
│ ├── compiler
│ ├── core
│ ├── distribute
│ ├── docs_src
│ ├── examples
│ ├── go
│ ├── java
│ ├── js
│ ├── lite
│ ├── python
│ ├── security
│ ├── stream_executor
│ └── tools
├── third_party
│ ├── absl
│ ├── android
│ ├── aws
│ ├── benchmark
│ ├── boringssl
│ ├── clang_toolchain
│ ├── clog
│ ├── compute_library
│ ├── cpuinfo
│ ├── dlpack
│ ├── eigen3
│ ├── farmhash
│ ├── fft2d
│ ├── flatbuffers
│ ├── FP16
│ ├── gemmlowp
│ ├── git
│ ├── googleapis
│ ├── gpus
│ ├── grpc
│ ├── hadoop
│ ├── hexagon
│ ├── highwayhash
│ ├── hwloc
│ ├── icu
│ ├── jpeg
│ ├── kissfft
│ ├── llvm
│ ├── llvm_openmp
│ ├── mkl
│ ├── mkl_dnn
│ ├── mlir
│ ├── mpi
│ ├── nasm
│ ├── nccl
│ ├── opencl_headers
│ ├── pasta
│ ├── protobuf
│ ├── psimd
│ ├── py
│ ├── python_runtime
│ ├── remote_config
│ ├── ruy
│ ├── sobol_data
│ ├── systemlibs
│ ├── tensorrt
│ ├── tf_runtime
│ └── vulkan_headers
└── tools
66 directories
maliankang@AwExdroid112:~/tensorflow$
算子实现集中分布在tensorflow/tensorflow/lite/kernels目录下:
maliankang@AwExdroid112:~/tensorflow/tensorflow/lite/kernels$ ls -l |grep test|wc -l
139
maliankang@AwExdroid112:~/tensorflow/tensorflow/lite/kernels$ ls -l |wc -l
298
maliankang@AwExdroid112:~/tensorflow/tensorflow/lite/kernels$
基本上,每个算子的实现都是一个独立文件,并且对应一个测试文件,基于这个假设(和实际相符),我们可以粗略统计一下算子的个数,就是
文件总数-test文件总数=298-139 = 159,也就是大概有160个算子,是否可以理解为160个算子基本能够满足所有网络的需求呢?我认为是的,基于的考虑是TF是一个比较全面的框架.
以常用的conv算子为例,简单分析一下它的实现:
对应的真正实现在 optimized_ops命名空间中的Conv函数,它在另一个文件中,我们找到它, 万恶的矩阵乘法,一眼能看明白的,肯定是数学系毕业的大佬。