+
+Figure 2. PaddlePaddle with MKL Engines
+
+
+## Actions
+
+添加的相关文件和目录结构如下:
+
+```txt
+PaddlePaddle/Paddle
+├── ...
+├── cmake/
+│ ├── external/
+│ │ ├── ...
+│ │ ├── mkldnn.cmake
+│ │ └── mklml.cmake
+└── paddle/
+ ├── ...
+ ├── math/
+ │ ├── ...
+ │ └── MKLDNNMatrix.*
+ └── gserver/
+ ├── ...
+ ├── layers/
+ │ ├── ...
+ │ └── MKLDNN*Layer.*
+ ├── activations/
+ │ ├── ...
+ │ └── MKLDNNActivations.*
+ └── tests/
+ ├── ...
+ ├── MKLDNNTester.*
+ └── test_MKLDNN.cpp
+```
+
+### CMake
+在`CMakeLists.txt`中提供一个与MKL有关的总开关:`WITH_MKL`,它负责决定编译时是否使用MKLML和MKL-DNN
+
+- `WITH_MKLML` 控制是否使用MKLML库。
+当打开`WITH_MKL`时,会自动使用MKLML库作为PaddlePaddle的CBLAS和LAPACK库,同时会开启Intel OpenMP用于提高MKLML的性能。
+编译时会把对应的头文件和库放在`build/third_party/install/mklml/*`目录下对应的地方。
+MKLML的库目前都是动态库,主要包括`libiomp5.so`和`libmklml_intel.so`。
+- `WITH_MKLDNN` 控制是否使用MKL-DNN。
+当开启`WITH_MKL`时,会自动根据硬件配置[[2](#references)]选择是否编译MKL-DNN。
+编译时会把对应的头文件和库放在`build/third_party/install/mkldnn/*`目录下对应的地方。
+MKL-DNN的库目前只有动态库`libmkldnn.so`。
+
+### Matrix
+目前在PaddlePaddle中数据都是以`NCHW`的格式存储,但是在MKL-DNN中的排列方式不止这一种。
+所以我们定义了一个`MKLDNNMatrix`用于管理MKL-DNN数据的不同格式以及相互之间的转换。
+
+