Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
BaiXuePrincess
Paddle
提交
464c23c4
P
Paddle
项目概览
BaiXuePrincess
/
Paddle
与 Fork 源项目一致
Fork自
PaddlePaddle / Paddle
通知
1
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
P
Paddle
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
464c23c4
编写于
9月 14, 2017
作者:
T
Travis CI
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Deploy to GitHub Pages:
c86e7e2a
上级
a72101ec
变更
3
展开全部
隐藏空白更改
内联
并排
Showing
3 changed file
with
26 addition
and
70 deletion
+26
-70
develop/doc_cn/_sources/howto/dev/new_op_cn.md.txt
develop/doc_cn/_sources/howto/dev/new_op_cn.md.txt
+13
-36
develop/doc_cn/howto/dev/new_op_cn.html
develop/doc_cn/howto/dev/new_op_cn.html
+12
-33
develop/doc_cn/searchindex.js
develop/doc_cn/searchindex.js
+1
-1
未找到文件。
develop/doc_cn/_sources/howto/dev/new_op_cn.md.txt
浏览文件 @
464c23c4
...
...
@@ -34,7 +34,7 @@ Kernel实现 | CPU、GPU共享Kernel实现在`.h`文件中,否则,CPU
注册Op | Op注册实现在`.cc`文件;Kernel注册CPU实现在`.cc`文件中,GPU实现在`.cu`文件中
实现新的op都添加至目录[paddle/operators](https://github.com/PaddlePaddle/Paddle/tree/develop/paddle/operators)下,文件命名以`*_op.h`(如有) 、 `*_op.cc` 、`*_op.cu`(如有)结尾。
实现新的op都添加至目录[paddle/operators](https://github.com/PaddlePaddle/Paddle/tree/develop/paddle/operators)下,文件命名以`*_op.h`(如有) 、 `*_op.cc` 、`*_op.cu`(如有)结尾。
**系统会根据文件名自动构建op和其对应的Python扩展。**
下面以矩阵乘操作,即[MulOp](https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/operators/mul_op.cc)为例来介绍如何写带Kernel的Operator。
...
...
@@ -224,45 +224,15 @@ MulOp(const std::string &type, const framework::VariableNameMap &inputs,
### 5. 编译
- 简单**无特殊依赖**的OP无需修改CMakeList.txt文件。[paddle/operators/CMakeLists.txt](https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/operators/CMakeLists.txt) 会自动将 `paddle/operators` 目录下新增的 `*_op.cc` 文件加入编译。
- 较为复杂、**有额外依赖** 的operator仍需要修改[paddle/operators/CMakeLists.txt](https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/operators/CMakeLists.txt)。如,`mul_op` 依赖 `math_function`,需要在`CMakeLists.txt`中添加如下内容:
运行下面命令可以进行编译:
```
op_library(mul_op SRCS mul_op.cc mul_op.cu DEPS math_function) +
```
- 运行下面命令可以进行编译:
```
make mul_op
```
```
make mul_op
```
## 绑定Python
- 绑定Python
在 [`paddle/pybind/pybind.cc
`](https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/pybind/pybind.cc) 使用`USE_OP`告知编译器需要链接的Op,具体解释参考[代码注释](https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/framework/op_registry.h#L81)。
```
USE_OP(mul);
```
如果只实现了CPU版本,则使用`USE_CPU_ONLY_OP`:
```
USE_CPU_ONLY_OP(gather);
```
如果OP不带Kernel,则使用`USE_NO_KENREL_OP`:
```
USE_NO_KENREL_OP(recurrent);
```
- 生成库
`paddle/operators` 目录下新增的 `*_op.cc` 文件会被自动添加链接到生成的lib库中。
系统会对新增的op自动绑定Python,并链接到生成的lib库中。
## 实现单元测试
...
...
@@ -367,3 +337,10 @@ make test ARGS="-R test_mul_op -V"
```bash
ctest -R test_mul_op
```
## 注意事项
- 为每个Op创建单独的`*_op.h`(如有)、`*_op.cc`和`*_op.cu`(如有)。不允许一个文件中包含多个Op,这将会导致编译出错。
- 注册Op时的类型名,需要和该Op的名字一样。即不允许在`A_op.cc`里面,注册`REGISTER_OP(B, ...)`等,这将会导致单元测试出错。
- 如果Op没有实现GPU Kernel,请不要创建空的`*_op.cu`,这将会导致单元测试出错。
- 如果多个Op依赖一些共用的函数,可以创建非`*_op.*`格式的文件来存放,如`gather.h`文件。
develop/doc_cn/howto/dev/new_op_cn.html
浏览文件 @
464c23c4
...
...
@@ -220,7 +220,7 @@ OpProtoMake定义 | <code class="docutils literal"><span class="pre">.cc</span>
Op定义 |
<code
class=
"docutils literal"
><span
class=
"pre"
>
.cc
</span></code>
文件
Kernel实现 | CPU、GPU共享Kernel实现在
<code
class=
"docutils literal"
><span
class=
"pre"
>
.h
</span></code>
文件中,否则,CPU 实现在
<code
class=
"docutils literal"
><span
class=
"pre"
>
.cc
</span></code>
文件中,GPU 实现在
<code
class=
"docutils literal"
><span
class=
"pre"
>
.cu
</span></code>
文件中。
注册Op | Op注册实现在
<code
class=
"docutils literal"
><span
class=
"pre"
>
.cc
</span></code>
文件;Kernel注册CPU实现在
<code
class=
"docutils literal"
><span
class=
"pre"
>
.cc
</span></code>
文件中,GPU实现在
<code
class=
"docutils literal"
><span
class=
"pre"
>
.cu
</span></code>
文件中
</p>
<p>
实现新的op都添加至目录
<a
class=
"reference external"
href=
"https://github.com/PaddlePaddle/Paddle/tree/develop/paddle/operators"
>
paddle/operators
</a>
下,文件命名以
<code
class=
"docutils literal"
><span
class=
"pre"
>
*_op.h
</span></code>
(如有) 、
<code
class=
"docutils literal"
><span
class=
"pre"
>
*_op.cc
</span></code>
、
<code
class=
"docutils literal"
><span
class=
"pre"
>
*_op.cu
</span></code>
(如有)结尾。
</p>
<p>
实现新的op都添加至目录
<a
class=
"reference external"
href=
"https://github.com/PaddlePaddle/Paddle/tree/develop/paddle/operators"
>
paddle/operators
</a>
下,文件命名以
<code
class=
"docutils literal"
><span
class=
"pre"
>
*_op.h
</span></code>
(如有) 、
<code
class=
"docutils literal"
><span
class=
"pre"
>
*_op.cc
</span></code>
、
<code
class=
"docutils literal"
><span
class=
"pre"
>
*_op.cu
</span></code>
(如有)结尾。
<
strong>
系统会根据文件名自动构建op和其对应的Python扩展。
</strong><
/p>
<p>
下面以矩阵乘操作,即
<a
class=
"reference external"
href=
"https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/operators/mul_op.cc"
>
MulOp
</a>
为例来介绍如何写带Kernel的Operator。
</p>
</div>
<div
class=
"section"
id=
"c"
>
...
...
@@ -389,45 +389,15 @@ Kernel实现 | CPU、GPU共享Kernel实现在<code class="docutils literal
</div>
<div
class=
"section"
id=
""
>
<span
id=
"id4"
></span><h3>
5. 编译
<a
class=
"headerlink"
href=
"#"
title=
"永久链接至标题"
>
¶
</a></h3>
<ul>
<li><p
class=
"first"
>
简单
<strong>
无特殊依赖
</strong>
的OP无需修改CMakeList.txt文件。
<a
class=
"reference external"
href=
"https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/operators/CMakeLists.txt"
>
paddle/operators/CMakeLists.txt
</a>
会自动将
<code
class=
"docutils literal"
><span
class=
"pre"
>
paddle/operators
</span></code>
目录下新增的
<code
class=
"docutils literal"
><span
class=
"pre"
>
*_op.cc
</span></code>
文件加入编译。
</p>
</li>
<li><p
class=
"first"
>
较为复杂、
<strong>
有额外依赖
</strong>
的operator仍需要修改
<a
class=
"reference external"
href=
"https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/operators/CMakeLists.txt"
>
paddle/operators/CMakeLists.txt
</a>
。如,
<code
class=
"docutils literal"
><span
class=
"pre"
>
mul_op
</span></code>
依赖
<code
class=
"docutils literal"
><span
class=
"pre"
>
math_function
</span></code>
,需要在
<code
class=
"docutils literal"
><span
class=
"pre"
>
CMakeLists.txt
</span></code>
中添加如下内容:
</p>
<div
class=
"highlight-default"
><div
class=
"highlight"
><pre><span></span><span
class=
"n"
>
op_library
</span><span
class=
"p"
>
(
</span><span
class=
"n"
>
mul_op
</span>
<span
class=
"n"
>
SRCS
</span>
<span
class=
"n"
>
mul_op
</span><span
class=
"o"
>
.
</span><span
class=
"n"
>
cc
</span>
<span
class=
"n"
>
mul_op
</span><span
class=
"o"
>
.
</span><span
class=
"n"
>
cu
</span>
<span
class=
"n"
>
DEPS
</span>
<span
class=
"n"
>
math_function
</span><span
class=
"p"
>
)
</span>
<span
class=
"o"
>
+
</span>
</pre></div>
</div>
</li>
<li><p
class=
"first"
>
运行下面命令可以进行编译:
</p>
<p>
运行下面命令可以进行编译:
</p>
<div
class=
"highlight-default"
><div
class=
"highlight"
><pre><span></span><span
class=
"n"
>
make
</span>
<span
class=
"n"
>
mul_op
</span>
</pre></div>
</div>
</li>
</ul>
</div>
</div>
<div
class=
"section"
id=
"python"
>
<span
id=
"python"
></span><h2>
绑定Python
<a
class=
"headerlink"
href=
"#python"
title=
"永久链接至标题"
>
¶
</a></h2>
<ul>
<li><p
class=
"first"
>
绑定Python
</p>
<p>
在
<a
class=
"reference external"
href=
"https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/pybind/pybind.cc"
><code
class=
"docutils literal"
><span
class=
"pre"
>
paddle/pybind/pybind.cc
</span></code></a>
使用
<code
class=
"docutils literal"
><span
class=
"pre"
>
USE_OP
</span></code>
告知编译器需要链接的Op,具体解释参考
<a
class=
"reference external"
href=
"https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/framework/op_registry.h#L81"
>
代码注释
</a>
。
</p>
<div
class=
"highlight-default"
><div
class=
"highlight"
><pre><span></span><span
class=
"n"
>
USE_OP
</span><span
class=
"p"
>
(
</span><span
class=
"n"
>
mul
</span><span
class=
"p"
>
);
</span>
</pre></div>
</div>
<p>
如果只实现了CPU版本,则使用
<code
class=
"docutils literal"
><span
class=
"pre"
>
USE_CPU_ONLY_OP
</span></code>
:
</p>
<div
class=
"highlight-default"
><div
class=
"highlight"
><pre><span></span><span
class=
"n"
>
USE_CPU_ONLY_OP
</span><span
class=
"p"
>
(
</span><span
class=
"n"
>
gather
</span><span
class=
"p"
>
);
</span>
</pre></div>
</div>
<p>
如果OP不带Kernel,则使用
<code
class=
"docutils literal"
><span
class=
"pre"
>
USE_NO_KENREL_OP
</span></code>
:
</p>
<div
class=
"highlight-default"
><div
class=
"highlight"
><pre><span></span><span
class=
"n"
>
USE_NO_KENREL_OP
</span><span
class=
"p"
>
(
</span><span
class=
"n"
>
recurrent
</span><span
class=
"p"
>
);
</span>
</pre></div>
</div>
</li>
</ul>
<ul>
<li><p
class=
"first"
>
生成库
</p>
<p><code
class=
"docutils literal"
><span
class=
"pre"
>
paddle/operators
</span></code>
目录下新增的
<code
class=
"docutils literal"
><span
class=
"pre"
>
*_op.cc
</span></code>
文件会被自动添加链接到生成的lib库中。
</p>
</li>
</ul>
<p>
系统会对新增的op自动绑定Python,并链接到生成的lib库中。
</p>
</div>
<div
class=
"section"
id=
""
>
<span
id=
"id5"
></span><h2>
实现单元测试
<a
class=
"headerlink"
href=
"#"
title=
"永久链接至标题"
>
¶
</a></h2>
...
...
@@ -527,6 +497,15 @@ Kernel实现 | CPU、GPU共享Kernel实现在<code class="docutils literal
</div>
</div>
</div>
<div
class=
"section"
id=
""
>
<span
id=
"id9"
></span><h2>
注意事项
<a
class=
"headerlink"
href=
"#"
title=
"永久链接至标题"
>
¶
</a></h2>
<ul
class=
"simple"
>
<li>
为每个Op创建单独的
<code
class=
"docutils literal"
><span
class=
"pre"
>
*_op.h
</span></code>
(如有)、
<code
class=
"docutils literal"
><span
class=
"pre"
>
*_op.cc
</span></code>
和
<code
class=
"docutils literal"
><span
class=
"pre"
>
*_op.cu
</span></code>
(如有)。不允许一个文件中包含多个Op,这将会导致编译出错。
</li>
<li>
注册Op时的类型名,需要和该Op的名字一样。即不允许在
<code
class=
"docutils literal"
><span
class=
"pre"
>
A_op.cc
</span></code>
里面,注册
<code
class=
"docutils literal"
><span
class=
"pre"
>
REGISTER_OP(B,
</span>
<span
class=
"pre"
>
...)
</span></code>
等,这将会导致单元测试出错。
</li>
<li>
如果Op没有实现GPU Kernel,请不要创建空的
<code
class=
"docutils literal"
><span
class=
"pre"
>
*_op.cu
</span></code>
,这将会导致单元测试出错。
</li>
<li>
如果多个Op依赖一些共用的函数,可以创建非
<code
class=
"docutils literal"
><span
class=
"pre"
>
*_op.*
</span></code>
格式的文件来存放,如
<code
class=
"docutils literal"
><span
class=
"pre"
>
gather.h
</span></code>
文件。
</li>
</ul>
</div>
</div>
...
...
develop/doc_cn/searchindex.js
浏览文件 @
464c23c4
此差异已折叠。
点击以展开。
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录