From 450ac64c67084af3db8a65ea875445b6e830ce8d Mon Sep 17 00:00:00 2001 From: tensor-tang Date: Fri, 4 Aug 2017 16:02:00 +0800 Subject: [PATCH] refine and add overview --- doc/design/mkldnn/README.MD | 39 ++++++++++++++------------- doc/design/mkldnn/image/overview.png | Bin 0 -> 9884 bytes 2 files changed, 21 insertions(+), 18 deletions(-) create mode 100644 doc/design/mkldnn/image/overview.png diff --git a/doc/design/mkldnn/README.MD b/doc/design/mkldnn/README.MD index 353b03e44..811ac3207 100644 --- a/doc/design/mkldnn/README.MD +++ b/doc/design/mkldnn/README.MD @@ -11,7 +11,8 @@ ## Contents - [Overall](#overall) - - [Cmake](#cmake) +- [Details](#details) + - [Cmake](#cmake) - [Layer](#layer) - [Activation](#activation) - [Unit Test](#unit-test) @@ -19,15 +20,19 @@ - [Python API](#python-api) - [Demo](#demo) - [Benchmark](#benchmark) - - [Others](#others) -- [Optimized Design](#optimized-design) - - [New](#new) - - [Add](#add) - + - [Others](#others) +- [KeyPoints](#keypoints) ## Overall -整体上,我们粗略的把集成方案分为了如下几个方面。 +我们会把MKLDNN作为第三方库集成进PaddlePaddle,整体框架图 +
+
+Figure 1. PaddlePaddle on IA. +
+ +## Details +我们把集成方案大致分为了如下几个方面。 ### Cmake 我们会在`CMakeLists.txt`中会添加`WITH_MKLDNN`的选项,当设置这个值为`ON`的时候会启用编译MKLDNN功能。同时会自动开启`OpenMP`用于提高MKLDNN的性能。 @@ -83,21 +88,19 @@ Activation的测试,计划在Paddle原有的测试文件上直接添加测试t 1. 如果在使用MKLDNN的情况下,会把CPU的Buffer对齐为64。 2. 深入PaddlePaddle,寻找有没有其他可以优化的可能,进一步优化。比如可能会用`OpenMP`改进SGD的更新性能。 -## Optimized Design +## KeyPoints 为了更好的符合PaddlePaddle的代码风格,同时又尽可能少的牺牲MKLDNN的性能。 -我们决定尽可能少的在PaddlePaddle的父类Layer中添加变量或者函数,改用已有的`deviceId_`变量来区分layer的属性,定义`-2`为MkldnnLayer特有的设备ID。 +我们总结出一些特别需要注意的点: -### New -1. 创建**MkldnnLayer**,并override父类Layer的`init`函数,修改`deviceId_`为`-2`,代表这个layer是用于跑在MKLDNN的环境下。 -2. 创建**MkldnnMatrix**,用于管理MKLDNN会用到的相关memory函数和接口。 -3. 创建**MkldnnBase**,定义一些除了layer和memory相关的类和函数。包括MKLDNN会用到Stream和CpuEngine,和未来可能还会用到FPGAEngine等。 - -### Add -1. 在现有的**Argument**里面添加两个**MkldnnMatrixPtr**,取名为mkldnnValue和mkldnnGrad,用于存放MkldnnLayer会用到的memory buffer。 并且添加函数cvt(会修改为一个更加合适的函数名),用于处理"CPU device"和"MKLDNN device"之间memory的相互转化。 -2. 在父类Layer中的`getOutput`函数中添加一段逻辑,用于判断`deviceId`,并针对device在MKLDNN和CPU之间不统一的情况,做一个前期转换。 也就是调用`Argument`的cvt函数把output统一到需要的device上。 -3. 在原来的`FLAGS`中添加一个`use_mkldnn`的flag,用于选择是否使用MKLDNN的相关功能。 +1. 使用**deviceId_**。为了尽可能少的在父类Layer中添加变量或者函数,我们决定使用已有的`deviceId_`变量来区分layer的属性,定义`-2`为**MkldnnLayer**特有的设备ID。 +2. 重写父类Layer的**init**函数,修改`deviceId_`为`-2`,代表这个layer是用于跑在MKLDNN的环境下。 +3. 创建**MkldnnMatrix**,用于管理MKLDNN会用到的相关memory函数和接口。 +4. 创建**MkldnnBase**,定义一些除了layer和memory相关的类和函数。包括MKLDNN会用到Stream和CpuEngine,和未来可能还会用到FPGAEngine等。 +5. 在**Argument**里添加两个MkldnnMatrixPtr,取名为mkldnnValue和mkldnnGrad,用于存放MkldnnLayer会用到的memory buffer。 并且添加函数cvt(会修改为一个更加合适的函数名),用于处理"CPU device"和"MKLDNN device"之间memory的相互转化。 +6. 在父类Layer中的**getOutput**函数中添加一段逻辑,用于判断`deviceId`,并针对device在MKLDNN和CPU之间不统一的情况,做一个前期转换。 也就是调用`Argument`的cvt函数把output统一到需要的device上。 +7. 在原来的`FLAGS`中添加一个`use_mkldnn`的flag,用于选择是否使用MKLDNN的相关功能。 ## References diff --git a/doc/design/mkldnn/image/overview.png b/doc/design/mkldnn/image/overview.png new file mode 100644 index 0000000000000000000000000000000000000000..84b455c28230703599a2529f014cfbb222138fef GIT binary patch literal 9884 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 ANdN!< literal 0 HcmV?d00001 -- GitLab