caffe源码阅读(一)python接口实现的原理

前言

开始使用caffe已经快半年了。因为最近准备开始自己写一个python layer,于是顺便开始阅读caffe源码,希望可以对caffe的底层有更加深入的了解。

caffe中python接口的原理

caffe中使用boost python对c++进行包装,使得用户可以在python中调用c++封装的类,使得layer的改写或者net结构的改写更加方便和随心所欲。

  • python使用c++扩展的基本方法

python中调用c/c++称为扩展,实现扩展的方法:
1、最原始方法:通过样板来包装c/c++代码。python和c++通过样本互相调用

2、SWIG SIP都定义了一种借口描述语言,需要先写一个接口描述文件来描述需要导出的c++函数和类。然后通过一个翻译器,将接口描述文件翻译成c++程序。最后编译连接生成的c++程序来生成扩展库

SWIG比较适合用来包装c语言程序,目前还不支持嵌套类等c++特性。

SIP包装qt库,其他方面的应用很少。

3、boost python是对c++支持最好的包装方法。并且可以使c++程序完全透明地导出进python使用。(即完全不需要修改原来的c++程序)。这使得boost python比同类工具更支持完善的c++程序,而且不需要承担贸然修改别人c++代码所带来的风险。

caffe使用的就是boost python方法。

  • boost python主要的两大功能

1、将python模块嵌入到c++程序
2、在python程序中调用c++程序

  • c++编译链接的过程

因为caffe是使用c++编写(工厂模式),因此这里介绍一下c++的编译和链接方式。(从一个个.h和.cpp文件变成包含0和1的可执行文件)

总体来说有一下几个环节:
源程序->预处理->编译和优化->生成目标文件->链接->可执行文件

1、预处理
在源程序被编译前,由预处理器对c++程序源代码进行的处理。(预处理器是指真正的编译开始之前由编译器调用的一个独立程序)。

预处理器主要负责:
(1)宏的替换
(2)删除注释
(3)处理预处理指令 #include #ifdef

2、编译和优化
主要包括:
(1)词法分析
(2)语法分析
(3)语义分析
(4)代码优化
(5)代码生成
inline函数(内联函数的替换就发生在这个阶段)

3、生成目标文件
在最终的目标文件中,至少包括以下内容:
(1)目标文件前身的cpp文件中包含的数据和代码
(2)未解决符号表
提供了所有在该编译单元中引用,但是定义并不在本编译单元中的符号及其地址。
(3)导出符号表
提供了本编译单元具有定义,并且愿意提供给其他编译单元使用的符号及其地址。
(4)地址重定向表
提供了本编译单元所有对自身地址的引用的记录

这些表都是为了告诉链接器自己需要什么以及自己可以提供什么

4、链接
一个个单独的目标函数是没有办法立即被执行的,例如:某个源文件可能引用了另一个源文件中定义的某个符号(变量或函数调用),或者在程序中调用了某个库文件的函数。

要靠链接器将所有目标文件、dll、库文件函数,自己定义的函数、头文件等整合在一起,才可以被执行。

tips:
(1)什么是dll?
dynamic link library 是微软公司在微软操作系统中实现共享函数库概念的一种方式,即动态链接库。

动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数,这段可执行代码位于一个dll文件中,该dll文件包含一个或多个已被编译、链接并与使用它的进程分开存储的函数。

dll还有助于共享数据和资源,多个应用程序可同时访问内存中单个dll副本的内容。

(2)库文件和普通头文件的区别?
库文件是别人编写成为一个可复用的模块,而普通头文件是用户自己定义便于自己使用的。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值