Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
BaiXuePrincess
Paddle
提交
9b1461a4
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看板
提交
9b1461a4
编写于
4月 21, 2017
作者:
T
Travis CI
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Deploy to GitHub Pages:
f979b126
上级
f1a9474d
变更
12
展开全部
显示空白变更内容
内联
并排
Showing
12 changed file
with
1140 addition
and
44 deletion
+1140
-44
develop/doc/_sources/design/multi_language_interface/00.why_plain_c.md.txt
...ces/design/multi_language_interface/00.why_plain_c.md.txt
+10
-10
develop/doc/_sources/design/multi_language_interface/01.inference_implementation.md.txt
...lti_language_interface/01.inference_implementation.md.txt
+131
-0
develop/doc/design/multi_language_interface/00.why_plain_c.html
...p/doc/design/multi_language_interface/00.why_plain_c.html
+11
-11
develop/doc/design/multi_language_interface/01.inference_implementation.html
...multi_language_interface/01.inference_implementation.html
+413
-0
develop/doc/objects.inv
develop/doc/objects.inv
+0
-0
develop/doc/searchindex.js
develop/doc/searchindex.js
+1
-1
develop/doc_cn/_sources/design/multi_language_interface/00.why_plain_c.md.txt
...ces/design/multi_language_interface/00.why_plain_c.md.txt
+10
-10
develop/doc_cn/_sources/design/multi_language_interface/01.inference_implementation.md.txt
...lti_language_interface/01.inference_implementation.md.txt
+131
-0
develop/doc_cn/design/multi_language_interface/00.why_plain_c.html
...oc_cn/design/multi_language_interface/00.why_plain_c.html
+11
-11
develop/doc_cn/design/multi_language_interface/01.inference_implementation.html
...multi_language_interface/01.inference_implementation.html
+421
-0
develop/doc_cn/objects.inv
develop/doc_cn/objects.inv
+0
-0
develop/doc_cn/searchindex.js
develop/doc_cn/searchindex.js
+1
-1
未找到文件。
develop/doc/_sources/design/multi_language_interface/why_plain_c.md.txt
→
develop/doc/_sources/design/multi_language_interface/
00.
why_plain_c.md.txt
浏览文件 @
9b1461a4
...
@@ -58,32 +58,32 @@ typedef void* paddle_matrix;
...
@@ -58,32 +58,32 @@ typedef void* paddle_matrix;
typedef int paddle_error;
typedef int paddle_error;
extern "C"
extern "C"
paddle_error paddle_matrix_shape(paddle_matrix matrix,
paddle_error paddle_matrix_
get_
shape(paddle_matrix matrix,
uint64_t* width,
uint64_t* width,
uint64_t* height);
uint64_t* height);
```
```
而在CPP里面实现这个C的接口,文件 `paddle_matrix.cpp`
而在CPP里面实现这个C的接口,文件 `paddle_matrix.cpp`
```cpp
```cpp
#include "paddle/math/matrix.h
pp
"
#include "paddle/math/matrix.h"
extern "C"
extern "C"
paddle_error paddle_matrix_shape(paddle_matrix matrix,
paddle_error paddle_matrix_shape(paddle_matrix matrix,
uint64_t *width,
uint64_t *width,
uint64_t *height) {
uint64_t *height) {
auto m = (paddle::
math::m
atrix*)(matrix);
auto m = (paddle::
capi::CM
atrix*)(matrix);
*width = m->width();
*width = m->width();
*height = m->height();
*height = m->height();
}
}
```
```
其中`paddle/
math/m
atrix.hpp`文件内容为:
其中`paddle/
capi/CM
atrix.hpp`文件内容为:
```cpp
```cpp
namespace paddle {
namespace paddle {
namespace math {
namespace math {
class Matrix {
class
C
Matrix {
//...
std::shared_ptr<paddle::Matrix> mat;
};
};
} // namespace math
} // namespace math
...
@@ -113,6 +113,6 @@ class Matrix {
...
@@ -113,6 +113,6 @@ class Matrix {
| 手写多语言绑定 | 不使用SWIG | 使用SWIG需要多语言绑定的开发人员熟练掌握SWIG配置,社区参与困难。SWIG生成的代码不能保证多语言代码风格的一致性 |
| 手写多语言绑定 | 不使用SWIG | 使用SWIG需要多语言绑定的开发人员熟练掌握SWIG配置,社区参与困难。SWIG生成的代码不能保证多语言代码风格的一致性 |
##
简单
实现
## 实现
TBD
参考[Inference implementation](01.inference_implementation.md)
develop/doc/_sources/design/multi_language_interface/01.inference_implementation.md.txt
0 → 100644
浏览文件 @
9b1461a4
# C-API 模型推断实现文档
本文档描述Paddle C-API的实现细节。Paddle C-API是多语言API的基础部分。Paddle需要暴露的API很多。先实现模型推断的API,通过模型推断API的实现作为一个样例,来进行讨论。至于为什么需要C-API,请参考[Why Plain C](./00.why_plain_c.md)。
## Table of Contents
* [C-API 模型推断实现文档](#c-api-模型推断实现文档)
* [暴露接口原则](#暴露接口原则)
* [目录结构](#目录结构)
* [实现方式](#实现方式)
* [capi.h](#capih)
* [具体某种类型的头文件](#具体某种类型的头文件)
* [capi_private.h](#capi_privateh)
* [具体某种类型的实现文件](#具体某种类型的实现文件)
* [libpaddle_capi_shared.{so, dylib}](#libpaddle_capi_sharedso-dylib)
* [libpaddle_capi_whole.a](#libpaddle_capi_wholea)
* [examples](#examples)
* [编译选项](#编译选项)
## 暴露接口原则
1. 所有的接口均为C接口。即使用`extern "C"`
2. 除构造某种类型的函数(`paddle_matrix_create`等),其他函数均返回`paddle_error`。且调用时不能抛出异常或出现运行时错误。
3. 所有类型名为`paddle_类型名`,所有与类型相关的函数,函数名为`paddle_类型名_函数名`
4. 如果某一个Paddle Core概念(GradientMachine/Matrix)需要被暴露到其他语言,那么
* 为了暴露的接口尽量简单。只暴露概念的接口,而不暴露概念的实现。即暴露`GradientMachine`或者`Matrix`但不暴露`RecurrentGradientMachine`和`CpuSparseMatrix`。
* 暴露这个概念必要函数。`必要`是指,即完成某一个任务的最少函数。
5. 不在`capi`接口层做过多封装。
* 如果某一个Paddle概念必须要暴露,但是又过于琐碎。不在`capi`这一层进行封装,而是直接修改Paddle Core。让Paddle核心中,这一概念不再琐碎。
## 目录结构
```text
Paddle
`-- paddle
`-- capi
`-- examples # The example project for C-API.
`-- tests # unittests for C-API
`-- capi.h # C-API header file.
`-- capi_private.h # The shared header file between implementation sources.
`-- matrix.{h, cpp}
`-- gradient_machine.{h, cpp}
`-- ...
```
Paddle的C-API目录结构如上图表所示。这个目录中除了`capi_private.h`之外的所有头文件,均会被安装到include/paddle路径下。C-API生成的二进制文件会被安装到`lib`目录下。即,安装后的目录结构为
```text
`-- include
`-- paddle
`-- capi.h
`-- matrix.h
`-- gradient_machine.h
`-- ...
`-- lib
`-- libpaddle_capi_shared.{so, dylib} # In mac, dynamic libary's file name extention is `dylib`
`-- libpaddle_capi_whole.a # static library for all symbols of Paddle.
```
## 实现方式
下面分别介绍某一类文件的实现方式。
### capi.h
`capi.h`是用户使用C-API时所唯一需要引入的头文件。在`capi.h`中,引入了类型的头文件,`matrix.h`, `gradient_machine.h`。在引入其他类型的头文件时,使用相对路径的引用方式。即`#include "matrix.h"`
### 具体某种类型的头文件
具体某种类型的头文件,即例如`matrix.h`,`gradient_machine.h`等。在这些头文件中,包含了某种类型的类型定义和暴露的全部函数。
这个头文件不假设其他文件的引用顺序,即使用户直接引用某种类型的头文件,也不应该报错(虽然不鼓励这样)。如果某一个类型需要引用另一个类型,例如`gradient_machine`需要引用`matrix`,则直接引入另一种类型的头文件,即`#include "matrix.h"`。
### capi_private.h
`capi_prviate.h`是各个实现中共享的头文件,他主要包含了实际暴露的类型结构。在用户使用C-API时,Paddle的类型全部退化成`void *`,即`typedef paddle_matrix void*`。但,对于每种C-API暴露的类型,均是在`capi_private.h`中实现的结构体。
```cpp
struct CMatrix {
int type = MatrixType;
std::shared_ptr<paddle::Matrix> mat;
};
```
通常,这个结构体包含两个项目。
* `type`是一个类型的标志。对于每种类型,type字段均不尽相同。这样,即使C-API接受的类型全是`void *`,我们也可以确定每一个参数的类型。
```cpp
void some_c_api_function(void* some_instance) {
int* type = (int *) some_instance;
switch (*type) {
case MatrixType:
CMatrix* mat = (CMatrix *) some_instance;
...
...
}
}
```
* 这个结构体中的另一个项目是,Paddle Core中这一类型接口的智能指针(shared_ptr)。
* 使用智能指针的原因是: 用户可以安全的释放某个C-API的实例,而不必在意Paddle Core是否还在使用这个实例。
* 例如,用户通过C-API获得了神经网络的参数实例。当用户使用完这个参数后,直接删除这个参数即可。即便Paddle Core中的模型还在使用这个参数,这个参数也不会一并删除。
### 具体某种类型的实现文件
具体某种类型的实现文件,即`matrix.cpp`, `gradient_machine.cpp`等文件。在这些文件中,使用C++ 11实现了C-API的接口,并且使用`extern "C"`导出这些接口。在实现过程中,对输入参数的安全性进行了必要的判断,并将C-API接口的参数转发给`Paddle Core`。
### libpaddle\_capi_shared.{so, dylib}
`libpaddle_capi_shared`是C-API导出的动态库。这个动态库的连接参数与Paddle的其他二进制(例如`paddle_trainer`)类似。用户可以直接使用这个动态库来引入Paddle C-API。具体使用方法为`-lpaddle_capi_shared`。
### libpaddle\_capi_whole.a
`libpaddle_capi_whole`是C-API导出的静态库。这个静态库包含了Paddle的全部符号。他是将`libpaddle_gserver.a`, `libpaddle_math.a`, `libpaddle_capi.a`等全部静态库中的目标文件全部打包后产生的文件。具体使用方法为`--whole-archive -lpaddle_capi_whole --no-whole-archive`。
### examples
在样例中,使用`C99`开发了模型预测的样例代码。具体请参考[example/README.md](../../../paddle/capi/examples/README.md)。
## 编译选项
C-API的编译选项默认关闭,打开这个编译选项,需要在cmake的时候,设置
```bash
cmake ${YOUR_SOURCE_ROOT} -DWITH_C_API=ON -DWITH_PYTHON=OFF -DWITH_SWIG_PY=OFF
```
编译C-API的时候推荐Paddle不嵌入Python解释器,也不生成`SWIG`接口,具体原因参考[Why Plain C](./00.why_plain_c.md)。
develop/doc/design/multi_language_interface/why_plain_c.html
→
develop/doc/design/multi_language_interface/
00.
why_plain_c.html
浏览文件 @
9b1461a4
...
@@ -185,7 +185,7 @@
...
@@ -185,7 +185,7 @@
</ul>
</ul>
</li>
</li>
<li><a
class=
"reference internal"
href=
"#"
>
原因列表
</a></li>
<li><a
class=
"reference internal"
href=
"#"
>
原因列表
</a></li>
<li><a
class=
"reference internal"
href=
"#"
>
简单
实现
</a></li>
<li><a
class=
"reference internal"
href=
"#"
>
实现
</a></li>
</ul>
</ul>
</li>
</li>
</ul>
</ul>
...
@@ -291,29 +291,29 @@
...
@@ -291,29 +291,29 @@
<span
class=
"k"
>
typedef
</span>
<span
class=
"kt"
>
int
</span>
<span
class=
"n"
>
paddle_error
</span><span
class=
"p"
>
;
</span>
<span
class=
"k"
>
typedef
</span>
<span
class=
"kt"
>
int
</span>
<span
class=
"n"
>
paddle_error
</span><span
class=
"p"
>
;
</span>
<span
class=
"k"
>
extern
</span>
<span
class=
"s"
>
"
C
"
</span>
<span
class=
"k"
>
extern
</span>
<span
class=
"s"
>
"
C
"
</span>
<span
class=
"n"
>
paddle_error
</span>
<span
class=
"n"
>
paddle_matrix_shape
</span><span
class=
"p"
>
(
</span><span
class=
"n"
>
paddle_matrix
</span>
<span
class=
"n"
>
matrix
</span><span
class=
"p"
>
,
</span>
<span
class=
"n"
>
paddle_error
</span>
<span
class=
"n"
>
paddle_matrix_
get_
shape
</span><span
class=
"p"
>
(
</span><span
class=
"n"
>
paddle_matrix
</span>
<span
class=
"n"
>
matrix
</span><span
class=
"p"
>
,
</span>
<span
class=
"kt"
>
uint64_t
</span><span
class=
"o"
>
*
</span>
<span
class=
"n"
>
width
</span><span
class=
"p"
>
,
</span>
<span
class=
"kt"
>
uint64_t
</span><span
class=
"o"
>
*
</span>
<span
class=
"n"
>
width
</span><span
class=
"p"
>
,
</span>
<span
class=
"kt"
>
uint64_t
</span><span
class=
"o"
>
*
</span>
<span
class=
"n"
>
height
</span><span
class=
"p"
>
);
</span>
<span
class=
"kt"
>
uint64_t
</span><span
class=
"o"
>
*
</span>
<span
class=
"n"
>
height
</span><span
class=
"p"
>
);
</span>
</pre></div>
</pre></div>
</div>
</div>
<p>
而在CPP里面实现这个C的接口,文件
<code
class=
"docutils literal"
><span
class=
"pre"
>
paddle_matrix.cpp
</span></code></p>
<p>
而在CPP里面实现这个C的接口,文件
<code
class=
"docutils literal"
><span
class=
"pre"
>
paddle_matrix.cpp
</span></code></p>
<div
class=
"highlight-cpp"
><div
class=
"highlight"
><pre><span></span><span
class=
"cp"
>
#include
</span>
<span
class=
"cpf"
>
"
paddle/math/matrix.h
pp
"
</span><span
class=
"cp"
></span>
<div
class=
"highlight-cpp"
><div
class=
"highlight"
><pre><span></span><span
class=
"cp"
>
#include
</span>
<span
class=
"cpf"
>
"
paddle/math/matrix.h
"
</span><span
class=
"cp"
></span>
<span
class=
"k"
>
extern
</span>
<span
class=
"s"
>
"
C
"
</span>
<span
class=
"k"
>
extern
</span>
<span
class=
"s"
>
"
C
"
</span>
<span
class=
"n"
>
paddle_error
</span>
<span
class=
"n"
>
paddle_matrix_shape
</span><span
class=
"p"
>
(
</span><span
class=
"n"
>
paddle_matrix
</span>
<span
class=
"n"
>
matrix
</span><span
class=
"p"
>
,
</span>
<span
class=
"n"
>
paddle_error
</span>
<span
class=
"n"
>
paddle_matrix_shape
</span><span
class=
"p"
>
(
</span><span
class=
"n"
>
paddle_matrix
</span>
<span
class=
"n"
>
matrix
</span><span
class=
"p"
>
,
</span>
<span
class=
"kt"
>
uint64_t
</span>
<span
class=
"o"
>
*
</span><span
class=
"n"
>
width
</span><span
class=
"p"
>
,
</span>
<span
class=
"kt"
>
uint64_t
</span>
<span
class=
"o"
>
*
</span><span
class=
"n"
>
width
</span><span
class=
"p"
>
,
</span>
<span
class=
"kt"
>
uint64_t
</span>
<span
class=
"o"
>
*
</span><span
class=
"n"
>
height
</span><span
class=
"p"
>
)
</span>
<span
class=
"p"
>
{
</span>
<span
class=
"kt"
>
uint64_t
</span>
<span
class=
"o"
>
*
</span><span
class=
"n"
>
height
</span><span
class=
"p"
>
)
</span>
<span
class=
"p"
>
{
</span>
<span
class=
"k"
>
auto
</span>
<span
class=
"n"
>
m
</span>
<span
class=
"o"
>
=
</span>
<span
class=
"p"
>
(
</span><span
class=
"n"
>
paddle
</span><span
class=
"o"
>
::
</span><span
class=
"n"
>
math
</span><span
class=
"o"
>
::
</span><span
class=
"n"
>
m
atrix
</span><span
class=
"o"
>
*
</span><span
class=
"p"
>
)(
</span><span
class=
"n"
>
matrix
</span><span
class=
"p"
>
);
</span>
<span
class=
"k"
>
auto
</span>
<span
class=
"n"
>
m
</span>
<span
class=
"o"
>
=
</span>
<span
class=
"p"
>
(
</span><span
class=
"n"
>
paddle
</span><span
class=
"o"
>
::
</span><span
class=
"n"
>
capi
</span><span
class=
"o"
>
::
</span><span
class=
"n"
>
CM
atrix
</span><span
class=
"o"
>
*
</span><span
class=
"p"
>
)(
</span><span
class=
"n"
>
matrix
</span><span
class=
"p"
>
);
</span>
<span
class=
"o"
>
*
</span><span
class=
"n"
>
width
</span>
<span
class=
"o"
>
=
</span>
<span
class=
"n"
>
m
</span><span
class=
"o"
>
-
>
</span><span
class=
"n"
>
width
</span><span
class=
"p"
>
();
</span>
<span
class=
"o"
>
*
</span><span
class=
"n"
>
width
</span>
<span
class=
"o"
>
=
</span>
<span
class=
"n"
>
m
</span><span
class=
"o"
>
-
>
</span><span
class=
"n"
>
width
</span><span
class=
"p"
>
();
</span>
<span
class=
"o"
>
*
</span><span
class=
"n"
>
height
</span>
<span
class=
"o"
>
=
</span>
<span
class=
"n"
>
m
</span><span
class=
"o"
>
-
>
</span><span
class=
"n"
>
height
</span><span
class=
"p"
>
();
</span>
<span
class=
"o"
>
*
</span><span
class=
"n"
>
height
</span>
<span
class=
"o"
>
=
</span>
<span
class=
"n"
>
m
</span><span
class=
"o"
>
-
>
</span><span
class=
"n"
>
height
</span><span
class=
"p"
>
();
</span>
<span
class=
"p"
>
}
</span>
<span
class=
"p"
>
}
</span>
</pre></div>
</pre></div>
</div>
</div>
<p>
其中
<code
class=
"docutils literal"
><span
class=
"pre"
>
paddle/
math/m
atrix.hpp
</span></code>
文件内容为:
</p>
<p>
其中
<code
class=
"docutils literal"
><span
class=
"pre"
>
paddle/
capi/CM
atrix.hpp
</span></code>
文件内容为:
</p>
<div
class=
"highlight-cpp"
><div
class=
"highlight"
><pre><span></span><span
class=
"k"
>
namespace
</span>
<span
class=
"n"
>
paddle
</span>
<span
class=
"p"
>
{
</span>
<div
class=
"highlight-cpp"
><div
class=
"highlight"
><pre><span></span><span
class=
"k"
>
namespace
</span>
<span
class=
"n"
>
paddle
</span>
<span
class=
"p"
>
{
</span>
<span
class=
"k"
>
namespace
</span>
<span
class=
"n"
>
math
</span>
<span
class=
"p"
>
{
</span>
<span
class=
"k"
>
namespace
</span>
<span
class=
"n"
>
math
</span>
<span
class=
"p"
>
{
</span>
<span
class=
"k"
>
class
</span>
<span
class=
"nc"
>
Matrix
</span>
<span
class=
"p"
>
{
</span>
<span
class=
"k"
>
class
</span>
<span
class=
"nc"
>
C
Matrix
</span>
<span
class=
"p"
>
{
</span>
<span
class=
"
c1"
>
//...
</span>
<span
class=
"
n"
>
std
</span><span
class=
"o"
>
::
</span><span
class=
"n"
>
shared_ptr
</span><span
class=
"o"
>
<
</span><span
class=
"n"
>
paddle
</span><span
class=
"o"
>
::
</span><span
class=
"n"
>
Matrix
</span><span
class=
"o"
>
>
</span>
<span
class=
"n"
>
mat
</span><span
class=
"p"
>
;
</span>
<span
class=
"p"
>
};
</span>
<span
class=
"p"
>
};
</span>
<span
class=
"p"
>
}
</span>
<span
class=
"c1"
>
// namespace math
</span>
<span
class=
"p"
>
}
</span>
<span
class=
"c1"
>
// namespace math
</span>
...
@@ -350,8 +350,8 @@
...
@@ -350,8 +350,8 @@
| 手写多语言绑定 | 不使用SWIG | 使用SWIG需要多语言绑定的开发人员熟练掌握SWIG配置,社区参与困难。SWIG生成的代码不能保证多语言代码风格的一致性 |
</p>
| 手写多语言绑定 | 不使用SWIG | 使用SWIG需要多语言绑定的开发人员熟练掌握SWIG配置,社区参与困难。SWIG生成的代码不能保证多语言代码风格的一致性 |
</p>
</div>
</div>
<div
class=
"section"
id=
""
>
<div
class=
"section"
id=
""
>
<span
id=
"id8"
></span><h2>
简单
实现
<a
class=
"headerlink"
href=
"#"
title=
"Permalink to this headline"
>
¶
</a></h2>
<span
id=
"id8"
></span><h2>
实现
<a
class=
"headerlink"
href=
"#"
title=
"Permalink to this headline"
>
¶
</a></h2>
<p>
TBD
</p>
<p>
参考
<a
class=
"reference internal"
href=
"01.inference_implementation.html"
><span
class=
"doc"
>
Inference implementation
</span></a>
</p>
</div>
</div>
</div>
</div>
...
...
develop/doc/design/multi_language_interface/01.inference_implementation.html
0 → 100644
浏览文件 @
9b1461a4
此差异已折叠。
点击以展开。
develop/doc/objects.inv
浏览文件 @
9b1461a4
无法预览此类型文件
develop/doc/searchindex.js
浏览文件 @
9b1461a4
因为 它太大了无法显示 source diff 。你可以改为
查看blob
。
develop/doc_cn/_sources/design/multi_language_interface/why_plain_c.md.txt
→
develop/doc_cn/_sources/design/multi_language_interface/
00.
why_plain_c.md.txt
浏览文件 @
9b1461a4
...
@@ -58,32 +58,32 @@ typedef void* paddle_matrix;
...
@@ -58,32 +58,32 @@ typedef void* paddle_matrix;
typedef int paddle_error;
typedef int paddle_error;
extern "C"
extern "C"
paddle_error paddle_matrix_shape(paddle_matrix matrix,
paddle_error paddle_matrix_
get_
shape(paddle_matrix matrix,
uint64_t* width,
uint64_t* width,
uint64_t* height);
uint64_t* height);
```
```
而在CPP里面实现这个C的接口,文件 `paddle_matrix.cpp`
而在CPP里面实现这个C的接口,文件 `paddle_matrix.cpp`
```cpp
```cpp
#include "paddle/math/matrix.h
pp
"
#include "paddle/math/matrix.h"
extern "C"
extern "C"
paddle_error paddle_matrix_shape(paddle_matrix matrix,
paddle_error paddle_matrix_shape(paddle_matrix matrix,
uint64_t *width,
uint64_t *width,
uint64_t *height) {
uint64_t *height) {
auto m = (paddle::
math::m
atrix*)(matrix);
auto m = (paddle::
capi::CM
atrix*)(matrix);
*width = m->width();
*width = m->width();
*height = m->height();
*height = m->height();
}
}
```
```
其中`paddle/
math/m
atrix.hpp`文件内容为:
其中`paddle/
capi/CM
atrix.hpp`文件内容为:
```cpp
```cpp
namespace paddle {
namespace paddle {
namespace math {
namespace math {
class Matrix {
class
C
Matrix {
//...
std::shared_ptr<paddle::Matrix> mat;
};
};
} // namespace math
} // namespace math
...
@@ -113,6 +113,6 @@ class Matrix {
...
@@ -113,6 +113,6 @@ class Matrix {
| 手写多语言绑定 | 不使用SWIG | 使用SWIG需要多语言绑定的开发人员熟练掌握SWIG配置,社区参与困难。SWIG生成的代码不能保证多语言代码风格的一致性 |
| 手写多语言绑定 | 不使用SWIG | 使用SWIG需要多语言绑定的开发人员熟练掌握SWIG配置,社区参与困难。SWIG生成的代码不能保证多语言代码风格的一致性 |
##
简单
实现
## 实现
TBD
参考[Inference implementation](01.inference_implementation.md)
develop/doc_cn/_sources/design/multi_language_interface/01.inference_implementation.md.txt
0 → 100644
浏览文件 @
9b1461a4
# C-API 模型推断实现文档
本文档描述Paddle C-API的实现细节。Paddle C-API是多语言API的基础部分。Paddle需要暴露的API很多。先实现模型推断的API,通过模型推断API的实现作为一个样例,来进行讨论。至于为什么需要C-API,请参考[Why Plain C](./00.why_plain_c.md)。
## Table of Contents
* [C-API 模型推断实现文档](#c-api-模型推断实现文档)
* [暴露接口原则](#暴露接口原则)
* [目录结构](#目录结构)
* [实现方式](#实现方式)
* [capi.h](#capih)
* [具体某种类型的头文件](#具体某种类型的头文件)
* [capi_private.h](#capi_privateh)
* [具体某种类型的实现文件](#具体某种类型的实现文件)
* [libpaddle_capi_shared.{so, dylib}](#libpaddle_capi_sharedso-dylib)
* [libpaddle_capi_whole.a](#libpaddle_capi_wholea)
* [examples](#examples)
* [编译选项](#编译选项)
## 暴露接口原则
1. 所有的接口均为C接口。即使用`extern "C"`
2. 除构造某种类型的函数(`paddle_matrix_create`等),其他函数均返回`paddle_error`。且调用时不能抛出异常或出现运行时错误。
3. 所有类型名为`paddle_类型名`,所有与类型相关的函数,函数名为`paddle_类型名_函数名`
4. 如果某一个Paddle Core概念(GradientMachine/Matrix)需要被暴露到其他语言,那么
* 为了暴露的接口尽量简单。只暴露概念的接口,而不暴露概念的实现。即暴露`GradientMachine`或者`Matrix`但不暴露`RecurrentGradientMachine`和`CpuSparseMatrix`。
* 暴露这个概念必要函数。`必要`是指,即完成某一个任务的最少函数。
5. 不在`capi`接口层做过多封装。
* 如果某一个Paddle概念必须要暴露,但是又过于琐碎。不在`capi`这一层进行封装,而是直接修改Paddle Core。让Paddle核心中,这一概念不再琐碎。
## 目录结构
```text
Paddle
`-- paddle
`-- capi
`-- examples # The example project for C-API.
`-- tests # unittests for C-API
`-- capi.h # C-API header file.
`-- capi_private.h # The shared header file between implementation sources.
`-- matrix.{h, cpp}
`-- gradient_machine.{h, cpp}
`-- ...
```
Paddle的C-API目录结构如上图表所示。这个目录中除了`capi_private.h`之外的所有头文件,均会被安装到include/paddle路径下。C-API生成的二进制文件会被安装到`lib`目录下。即,安装后的目录结构为
```text
`-- include
`-- paddle
`-- capi.h
`-- matrix.h
`-- gradient_machine.h
`-- ...
`-- lib
`-- libpaddle_capi_shared.{so, dylib} # In mac, dynamic libary's file name extention is `dylib`
`-- libpaddle_capi_whole.a # static library for all symbols of Paddle.
```
## 实现方式
下面分别介绍某一类文件的实现方式。
### capi.h
`capi.h`是用户使用C-API时所唯一需要引入的头文件。在`capi.h`中,引入了类型的头文件,`matrix.h`, `gradient_machine.h`。在引入其他类型的头文件时,使用相对路径的引用方式。即`#include "matrix.h"`
### 具体某种类型的头文件
具体某种类型的头文件,即例如`matrix.h`,`gradient_machine.h`等。在这些头文件中,包含了某种类型的类型定义和暴露的全部函数。
这个头文件不假设其他文件的引用顺序,即使用户直接引用某种类型的头文件,也不应该报错(虽然不鼓励这样)。如果某一个类型需要引用另一个类型,例如`gradient_machine`需要引用`matrix`,则直接引入另一种类型的头文件,即`#include "matrix.h"`。
### capi_private.h
`capi_prviate.h`是各个实现中共享的头文件,他主要包含了实际暴露的类型结构。在用户使用C-API时,Paddle的类型全部退化成`void *`,即`typedef paddle_matrix void*`。但,对于每种C-API暴露的类型,均是在`capi_private.h`中实现的结构体。
```cpp
struct CMatrix {
int type = MatrixType;
std::shared_ptr<paddle::Matrix> mat;
};
```
通常,这个结构体包含两个项目。
* `type`是一个类型的标志。对于每种类型,type字段均不尽相同。这样,即使C-API接受的类型全是`void *`,我们也可以确定每一个参数的类型。
```cpp
void some_c_api_function(void* some_instance) {
int* type = (int *) some_instance;
switch (*type) {
case MatrixType:
CMatrix* mat = (CMatrix *) some_instance;
...
...
}
}
```
* 这个结构体中的另一个项目是,Paddle Core中这一类型接口的智能指针(shared_ptr)。
* 使用智能指针的原因是: 用户可以安全的释放某个C-API的实例,而不必在意Paddle Core是否还在使用这个实例。
* 例如,用户通过C-API获得了神经网络的参数实例。当用户使用完这个参数后,直接删除这个参数即可。即便Paddle Core中的模型还在使用这个参数,这个参数也不会一并删除。
### 具体某种类型的实现文件
具体某种类型的实现文件,即`matrix.cpp`, `gradient_machine.cpp`等文件。在这些文件中,使用C++ 11实现了C-API的接口,并且使用`extern "C"`导出这些接口。在实现过程中,对输入参数的安全性进行了必要的判断,并将C-API接口的参数转发给`Paddle Core`。
### libpaddle\_capi_shared.{so, dylib}
`libpaddle_capi_shared`是C-API导出的动态库。这个动态库的连接参数与Paddle的其他二进制(例如`paddle_trainer`)类似。用户可以直接使用这个动态库来引入Paddle C-API。具体使用方法为`-lpaddle_capi_shared`。
### libpaddle\_capi_whole.a
`libpaddle_capi_whole`是C-API导出的静态库。这个静态库包含了Paddle的全部符号。他是将`libpaddle_gserver.a`, `libpaddle_math.a`, `libpaddle_capi.a`等全部静态库中的目标文件全部打包后产生的文件。具体使用方法为`--whole-archive -lpaddle_capi_whole --no-whole-archive`。
### examples
在样例中,使用`C99`开发了模型预测的样例代码。具体请参考[example/README.md](../../../paddle/capi/examples/README.md)。
## 编译选项
C-API的编译选项默认关闭,打开这个编译选项,需要在cmake的时候,设置
```bash
cmake ${YOUR_SOURCE_ROOT} -DWITH_C_API=ON -DWITH_PYTHON=OFF -DWITH_SWIG_PY=OFF
```
编译C-API的时候推荐Paddle不嵌入Python解释器,也不生成`SWIG`接口,具体原因参考[Why Plain C](./00.why_plain_c.md)。
develop/doc_cn/design/multi_language_interface/why_plain_c.html
→
develop/doc_cn/design/multi_language_interface/
00.
why_plain_c.html
浏览文件 @
9b1461a4
...
@@ -192,7 +192,7 @@
...
@@ -192,7 +192,7 @@
</ul>
</ul>
</li>
</li>
<li><a
class=
"reference internal"
href=
"#"
>
原因列表
</a></li>
<li><a
class=
"reference internal"
href=
"#"
>
原因列表
</a></li>
<li><a
class=
"reference internal"
href=
"#"
>
简单
实现
</a></li>
<li><a
class=
"reference internal"
href=
"#"
>
实现
</a></li>
</ul>
</ul>
</li>
</li>
</ul>
</ul>
...
@@ -298,29 +298,29 @@
...
@@ -298,29 +298,29 @@
<span
class=
"k"
>
typedef
</span>
<span
class=
"kt"
>
int
</span>
<span
class=
"n"
>
paddle_error
</span><span
class=
"p"
>
;
</span>
<span
class=
"k"
>
typedef
</span>
<span
class=
"kt"
>
int
</span>
<span
class=
"n"
>
paddle_error
</span><span
class=
"p"
>
;
</span>
<span
class=
"k"
>
extern
</span>
<span
class=
"s"
>
"
C
"
</span>
<span
class=
"k"
>
extern
</span>
<span
class=
"s"
>
"
C
"
</span>
<span
class=
"n"
>
paddle_error
</span>
<span
class=
"n"
>
paddle_matrix_shape
</span><span
class=
"p"
>
(
</span><span
class=
"n"
>
paddle_matrix
</span>
<span
class=
"n"
>
matrix
</span><span
class=
"p"
>
,
</span>
<span
class=
"n"
>
paddle_error
</span>
<span
class=
"n"
>
paddle_matrix_
get_
shape
</span><span
class=
"p"
>
(
</span><span
class=
"n"
>
paddle_matrix
</span>
<span
class=
"n"
>
matrix
</span><span
class=
"p"
>
,
</span>
<span
class=
"kt"
>
uint64_t
</span><span
class=
"o"
>
*
</span>
<span
class=
"n"
>
width
</span><span
class=
"p"
>
,
</span>
<span
class=
"kt"
>
uint64_t
</span><span
class=
"o"
>
*
</span>
<span
class=
"n"
>
width
</span><span
class=
"p"
>
,
</span>
<span
class=
"kt"
>
uint64_t
</span><span
class=
"o"
>
*
</span>
<span
class=
"n"
>
height
</span><span
class=
"p"
>
);
</span>
<span
class=
"kt"
>
uint64_t
</span><span
class=
"o"
>
*
</span>
<span
class=
"n"
>
height
</span><span
class=
"p"
>
);
</span>
</pre></div>
</pre></div>
</div>
</div>
<p>
而在CPP里面实现这个C的接口,文件
<code
class=
"docutils literal"
><span
class=
"pre"
>
paddle_matrix.cpp
</span></code></p>
<p>
而在CPP里面实现这个C的接口,文件
<code
class=
"docutils literal"
><span
class=
"pre"
>
paddle_matrix.cpp
</span></code></p>
<div
class=
"highlight-cpp"
><div
class=
"highlight"
><pre><span></span><span
class=
"cp"
>
#include
</span>
<span
class=
"cpf"
>
"
paddle/math/matrix.h
pp
"
</span><span
class=
"cp"
></span>
<div
class=
"highlight-cpp"
><div
class=
"highlight"
><pre><span></span><span
class=
"cp"
>
#include
</span>
<span
class=
"cpf"
>
"
paddle/math/matrix.h
"
</span><span
class=
"cp"
></span>
<span
class=
"k"
>
extern
</span>
<span
class=
"s"
>
"
C
"
</span>
<span
class=
"k"
>
extern
</span>
<span
class=
"s"
>
"
C
"
</span>
<span
class=
"n"
>
paddle_error
</span>
<span
class=
"n"
>
paddle_matrix_shape
</span><span
class=
"p"
>
(
</span><span
class=
"n"
>
paddle_matrix
</span>
<span
class=
"n"
>
matrix
</span><span
class=
"p"
>
,
</span>
<span
class=
"n"
>
paddle_error
</span>
<span
class=
"n"
>
paddle_matrix_shape
</span><span
class=
"p"
>
(
</span><span
class=
"n"
>
paddle_matrix
</span>
<span
class=
"n"
>
matrix
</span><span
class=
"p"
>
,
</span>
<span
class=
"kt"
>
uint64_t
</span>
<span
class=
"o"
>
*
</span><span
class=
"n"
>
width
</span><span
class=
"p"
>
,
</span>
<span
class=
"kt"
>
uint64_t
</span>
<span
class=
"o"
>
*
</span><span
class=
"n"
>
width
</span><span
class=
"p"
>
,
</span>
<span
class=
"kt"
>
uint64_t
</span>
<span
class=
"o"
>
*
</span><span
class=
"n"
>
height
</span><span
class=
"p"
>
)
</span>
<span
class=
"p"
>
{
</span>
<span
class=
"kt"
>
uint64_t
</span>
<span
class=
"o"
>
*
</span><span
class=
"n"
>
height
</span><span
class=
"p"
>
)
</span>
<span
class=
"p"
>
{
</span>
<span
class=
"k"
>
auto
</span>
<span
class=
"n"
>
m
</span>
<span
class=
"o"
>
=
</span>
<span
class=
"p"
>
(
</span><span
class=
"n"
>
paddle
</span><span
class=
"o"
>
::
</span><span
class=
"n"
>
math
</span><span
class=
"o"
>
::
</span><span
class=
"n"
>
m
atrix
</span><span
class=
"o"
>
*
</span><span
class=
"p"
>
)(
</span><span
class=
"n"
>
matrix
</span><span
class=
"p"
>
);
</span>
<span
class=
"k"
>
auto
</span>
<span
class=
"n"
>
m
</span>
<span
class=
"o"
>
=
</span>
<span
class=
"p"
>
(
</span><span
class=
"n"
>
paddle
</span><span
class=
"o"
>
::
</span><span
class=
"n"
>
capi
</span><span
class=
"o"
>
::
</span><span
class=
"n"
>
CM
atrix
</span><span
class=
"o"
>
*
</span><span
class=
"p"
>
)(
</span><span
class=
"n"
>
matrix
</span><span
class=
"p"
>
);
</span>
<span
class=
"o"
>
*
</span><span
class=
"n"
>
width
</span>
<span
class=
"o"
>
=
</span>
<span
class=
"n"
>
m
</span><span
class=
"o"
>
-
>
</span><span
class=
"n"
>
width
</span><span
class=
"p"
>
();
</span>
<span
class=
"o"
>
*
</span><span
class=
"n"
>
width
</span>
<span
class=
"o"
>
=
</span>
<span
class=
"n"
>
m
</span><span
class=
"o"
>
-
>
</span><span
class=
"n"
>
width
</span><span
class=
"p"
>
();
</span>
<span
class=
"o"
>
*
</span><span
class=
"n"
>
height
</span>
<span
class=
"o"
>
=
</span>
<span
class=
"n"
>
m
</span><span
class=
"o"
>
-
>
</span><span
class=
"n"
>
height
</span><span
class=
"p"
>
();
</span>
<span
class=
"o"
>
*
</span><span
class=
"n"
>
height
</span>
<span
class=
"o"
>
=
</span>
<span
class=
"n"
>
m
</span><span
class=
"o"
>
-
>
</span><span
class=
"n"
>
height
</span><span
class=
"p"
>
();
</span>
<span
class=
"p"
>
}
</span>
<span
class=
"p"
>
}
</span>
</pre></div>
</pre></div>
</div>
</div>
<p>
其中
<code
class=
"docutils literal"
><span
class=
"pre"
>
paddle/
math/m
atrix.hpp
</span></code>
文件内容为:
</p>
<p>
其中
<code
class=
"docutils literal"
><span
class=
"pre"
>
paddle/
capi/CM
atrix.hpp
</span></code>
文件内容为:
</p>
<div
class=
"highlight-cpp"
><div
class=
"highlight"
><pre><span></span><span
class=
"k"
>
namespace
</span>
<span
class=
"n"
>
paddle
</span>
<span
class=
"p"
>
{
</span>
<div
class=
"highlight-cpp"
><div
class=
"highlight"
><pre><span></span><span
class=
"k"
>
namespace
</span>
<span
class=
"n"
>
paddle
</span>
<span
class=
"p"
>
{
</span>
<span
class=
"k"
>
namespace
</span>
<span
class=
"n"
>
math
</span>
<span
class=
"p"
>
{
</span>
<span
class=
"k"
>
namespace
</span>
<span
class=
"n"
>
math
</span>
<span
class=
"p"
>
{
</span>
<span
class=
"k"
>
class
</span>
<span
class=
"nc"
>
Matrix
</span>
<span
class=
"p"
>
{
</span>
<span
class=
"k"
>
class
</span>
<span
class=
"nc"
>
C
Matrix
</span>
<span
class=
"p"
>
{
</span>
<span
class=
"
c1"
>
//...
</span>
<span
class=
"
n"
>
std
</span><span
class=
"o"
>
::
</span><span
class=
"n"
>
shared_ptr
</span><span
class=
"o"
>
<
</span><span
class=
"n"
>
paddle
</span><span
class=
"o"
>
::
</span><span
class=
"n"
>
Matrix
</span><span
class=
"o"
>
>
</span>
<span
class=
"n"
>
mat
</span><span
class=
"p"
>
;
</span>
<span
class=
"p"
>
};
</span>
<span
class=
"p"
>
};
</span>
<span
class=
"p"
>
}
</span>
<span
class=
"c1"
>
// namespace math
</span>
<span
class=
"p"
>
}
</span>
<span
class=
"c1"
>
// namespace math
</span>
...
@@ -357,8 +357,8 @@
...
@@ -357,8 +357,8 @@
| 手写多语言绑定 | 不使用SWIG | 使用SWIG需要多语言绑定的开发人员熟练掌握SWIG配置,社区参与困难。SWIG生成的代码不能保证多语言代码风格的一致性 |
</p>
| 手写多语言绑定 | 不使用SWIG | 使用SWIG需要多语言绑定的开发人员熟练掌握SWIG配置,社区参与困难。SWIG生成的代码不能保证多语言代码风格的一致性 |
</p>
</div>
</div>
<div
class=
"section"
id=
""
>
<div
class=
"section"
id=
""
>
<span
id=
"id8"
></span><h2>
简单
实现
<a
class=
"headerlink"
href=
"#"
title=
"永久链接至标题"
>
¶
</a></h2>
<span
id=
"id8"
></span><h2>
实现
<a
class=
"headerlink"
href=
"#"
title=
"永久链接至标题"
>
¶
</a></h2>
<p>
TBD
</p>
<p>
参考
<a
class=
"reference internal"
href=
"01.inference_implementation.html"
><span
class=
"doc"
>
Inference implementation
</span></a>
</p>
</div>
</div>
</div>
</div>
...
...
develop/doc_cn/design/multi_language_interface/01.inference_implementation.html
0 → 100644
浏览文件 @
9b1461a4
此差异已折叠。
点击以展开。
develop/doc_cn/objects.inv
浏览文件 @
9b1461a4
无法预览此类型文件
develop/doc_cn/searchindex.js
浏览文件 @
9b1461a4
此差异已折叠。
点击以展开。
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录