MegDNN

MegDNN 是 MegEngine 的底层计算引擎,位于 dnn 目录。 它提供了与 dense tensor 相关的计算原语,比如 Convolution, Pooling, MatrixMul, Transpose 等。 它是跨平台的计算库,支持 x86 (with SSE4.2), arm (with NEON), CUDA (Kepler/Maxwell/Pascal), OpenCL(mali/adreno/powervr/cuda/intel, etc), Hexagon 等。

MegDNN 文件结构

dnn
├── atlas-stub
├── cuda-stub
├── include
│   ├── megdnn
│   │   ├── config
│   │   ├── dtype # 定义数据类型
│   │   ├── internal  # 仅供 MegDNN 内部实现使用的头文件
│   │   │   ├── defs.h  # 定义了与 TensorND 的维数(ndim)相关的宏
│   │   │   ├── opr_header_epilogue.h  # 定义 MegDNN operator 需要的宏
│   │   │   ├── opr_header_prologue.h  # 将 opr_header_prologue.h 中的宏 undef 掉
│   │   │   ├── visibility_epilogue.h  # 定义了与 visibility 相关的宏
│   │   │   └── visibility_prologue.h  # 将 visibility_prologue.h 中定义的宏 undef 掉
│   │   ├── oprs  # 定义了 MegDNN 的所有 operator
│   │   ├── thin  # 相较于 std 的一些简化实现
│   │   ├── arch.h  # 定义了一些平台与编译器相关的宏
│   │   ├── basic_types.h  # 定义了一些 MegDNN 基础类型,如 ErrorHandler/TensorShape/TensorLayout/TensorND/Workspace 等
│   │   ├── common.h
│   │   ├── cuda.h  # 定义了一些 CUDA 特有的 API
│   │   ├── dtype.h
│   │   ├── handle.h
│   │   ├── opr_param_defs.h  # 定义了一些结构体,表示 operator 的 param (由 scripts/gen_param_defs.py 自动生成)
│   │   ├── opr_result_defs.h  # 定义了一些结构体,表示 operator 的 result (由 scripts/gen_param_defs.py 自动生成)
│   │   ├── oprs.h  # 包含了 oprs 文件夹下的所有头文件
│   │   ├── tensor_format.h
│   │   ├── tensor_iter.h # 定义了 TensorIter 类,方便枚举 TensorND 内的所有元素。
│   │   └── version.h  # 定义了 MegDNN 的 version
│   ├── hip_header.h
│   ├── megcore_*.h  # MegCore 是一个跨平台线程管理库,将 CUDA "device" 和 "stream" 的概念与 CPU NUMA(尚未实现)和线程的概念抽象出来。
│   └── megdnn.h # MegDNN 的主头文件,MegDNN 的用户应使用此头文件。
├── scripts
├── src
│   ├── aarch64
│   ├── arm_common
│   ├── armv7
│   ├── atlas
│   ├── cambricon
│   ├── common # 定义了各个平台的公共代码,比如各个 operator 的 deduce_layout, OperatorBase, Handle 的方法定义。
│   ├── cuda
│   ├── fallback
│   ├── naive
│   ├── rocm
│   ├── x86
│   └── CMakeLists.txt
├── test
└── CMakeLists.txt