1.SWIG定义
2.健忘笔记swig+cmake生成目标语言[go,源码 java, c#]接口
3.利用swig封装C++的dll为C#方便使用
4.SWIG教程《二》
5.探索TensorFlow核心组件系列之Session的运行源码分析
6.win10 + CUDA 9.0 + cuDNN 7.0 + tensorflow源码编译安装
SWIG定义
SWIG是一个功能强大的开发工具,它的编译主要目标是协助开发者将用C或C++编写的软件无缝地融入到各种高级编程语言中。这个工具支持的源码编程语言种类繁多,包括但不限于Perl、编译PHP、源码Python、编译crm软件源码下载Tcl、源码Ruby和PHP等脚本语言,编译以及C#、源码Common Lisp(CLISP、编译Allegro CL、源码CFFI、编译UFFI)、源码Java、编译Modula-3、源码OCAML和R等非脚本语言。甚至,SWIG还能处理编译器或汇编语言的项目,如Guile、MzScheme和Chicken。
SWIG在实际应用中,常被用来构建高级语言的解析环境或编程接口,它作为一种工具,既可用于开发过程中的测试,也能够作为原型设计的首选。通过SWIG,开发者可以创建出高效、易用的用户界面。此外,SWIG的rxjava的源码开放源代码特性使其具有极高的灵活性,无论是商业项目还是个人开发,都可以自由地使用、发布和修改SWIG,适应各种应用场景。
健忘笔记swig+cmake生成目标语言[go, java, c#]接口
下载并安装SWIG,将swig的安装目录添加到windows的PATH环境变量中。使用配置文件xxx.i,生成目标语言所需的接口文件、.cxx和.h文件。在xxx.i文件中,使用%include指令引入c++头文件,仅对public范围内的成员变量和成员函数生效。注意仅需提供声明,swig不关心具体实现。通过Test1.h和Test1.cpp文件的示例,执行swig指令后,生成example.java。遇到Test1.h引用Test2.h的情况,需要额外添加%include "Test2.h",生成Test2.java文件。在java工程中,先创建Test2对象,再调用test2函数。使用%feature指定类或函数的特征,如director用于callback功能,目标语言调用c++,再反向调用目标语言。%template用于确定c++模板类型,以适应目标语言的layui翻页源码调用需求,不支持可变参数。在cmake中,可以将swig指令集成,简化目标语言为java、c#或go的开发流程。当目标语言为go时,c++工程编译可能报错,但不影响go调用,只需将生成文件和源码合并至go工程中。若在c++工程编译时,SWIG_ON宏失效,自定义宏用于判断工程是否需给其他语言调用。解决方法是在swig运行期间使用内置的宏,如SWIG和SWIG_VERSION,确保宏的正确性。
利用swig封装C++的dll为C#方便使用
在开发过程中,C++虽然在时间效率上有优势,但与C#相比,集成CTP库的便利性稍显不足。为了解决这个问题,有人尝试通过PINVOKE将C++函数转换为C#可用接口,但这个过程工作量巨大。为寻找更便捷的方法,我参考了一篇文章,决定尝试Swig进行C++与C#的交互封装。
Swig是一个强大的工具,它能将C++原始代码转化为其他语言可调用的形式。其转换C#主要分为两步:首先,创建C++动态链接库项目和C#桌面应用,cms源码模板然后编写swig规则定义文件(c++_file.idl)并正确设置属性,以避免编译错误。
接下来,编写C++头文件(c++_file.h)和源代码(C++_project.cpp),在C++_file.idl目录下运行Swig命令生成包含C#代码的.cs文件,并将dll文件与C#项目集成。在C#项目中,只需按照生成的C#代码进行调用,即可方便地使用C++库。
总结来说,通过Swig封装C++为C#的DLL,不仅显著减少了工作量,还促进了后续开发的高效性,使得原先的C++库更容易在C#环境中使用,提升了开发效率。
SWIG教程《二》
在SWIG教程中,了解变量属性的管理非常重要。使用%immutable指令可以创建只读字段,一旦变量被标记为不可变,除非明确使用%mutable指令将其改为可变状态,否则它始终为只读。
注意兼容性,先前的%readonly和%readwrite指令虽然仍能工作,但会生成警告信息。更推荐使用%immutable和%mutable指令,同时不要忘记额外的分号。
重命名功能允许在转换目标语言时处理关键字冲突。rename指令的范围从声明开始到文件结束,因此在引入重命名的ai交易源码头文件时,确保其在rename之后。
SWIG提供了强大的重命名工具,不仅限于单个命名,还可以批量重命名。例如,通过匹配规则为所有函数添加前缀,将所有蛇形命名转换为驼峰命名,剔除命名中的特定字符,以及对操作符重载函数进行重命名。
使用ignore指令可以忽略不需要封装的内容。可以选择性地忽略大部分符号,同时仅封装所需的方法或类,如在特定头文件中仅封装名为“Star”的类。
回调函数的实现需要提前声明,不能直接传入目标函数。一旦声明为回调,无法在目标函数中作为普通函数调用。对于既作为回调也作为普通函数调用的情况,可以采取特定的声明方式。
SWIG自动生成C++类的默认构造函数和析构函数,但可以通过指令或参数选项禁止。使用%nodefaultctor指令或命令行参数-nodefaultctor可以避免生成默认构造函数。对于析构函数,同样可以使用%nodefaultdtor指令禁止生成。
SWIG虽然能处理大部分C++语法,但并非完整的解析器,仍有部分语法无法解析。为C++类添加成员函数时,使用%extend指令为C类型的结构体绑定额外的成员函数,以辅助创建和使用。
SWIG输出的C/C++代码分为五部分,包括用户自定义的预处理器宏、内部支持代码、用户定义的支持代码、自动生成的封装代码,以及初始化模块的函数。
代码注入功能允许在特定代码段中插入自定义代码,使用指令或section名实现。例如,%runtime指令代替了使用%insert("runtime")。%{ ...%}指令实际上是%header %{ ...%}的简写。
在封装中使用初始化代码时,可以利用Init段进行特定的初始化操作。辅助函数的编写通常通过代码注入来简化,inline指令则提供了一种将代码块在封装和源代码中重复使用的方式,尽管其只适用于函数和变量,对于头文件的封装仍需通过%include指令告知SWIG。
探索TensorFlow核心组件系列之Session的运行源码分析
TensorFlow作为一个前后端分离的计算框架,旨在实现前端在任何设备、任何位置上使用API构建模型,而不受硬件资源限制。那么,TensorFlow是如何建立前后端的连接呢?在这一过程中,Session起着关键桥梁作用,它连接前后端通道,并通过session.run()触发计算,将前端的计算图转化为graphdef pb格式发送至后端。后端接收此格式,将计算图重建、剪枝、分裂,并分配到设备上,最终在多个Executor上执行计算。
Session管理着计算图、变量、队列、锁、设备和内存等多种资源,确保资源安全、高效地使用。在Session生命周期中,包含创建、运行、关闭和销毁四个阶段,确保模型运行的正确性和效率。
在Session创建时,使用BaseSession初始化,通过调用TF_NewSessionRef创建实例。此过程涉及确定图实例、判断混合精度设置以及创建Session。在分布式框架中,Python通过swig自动生成的函数符号映射关系调用C++层实现。
Session运行主要通过session.run()触发,该方法在BaseSession的run()中实现,涉及创建fetch处理器、获取最终fetches和targets,调用_do_run方法启动计算,并输出结果。在本地模式下,Session初始化会生成DirectSession对象。
综上所述,Session在TensorFlow架构中扮演着核心角色,连接前后端,管理资源,并确保模型高效、安全地运行。
win + CUDA 9.0 + cuDNN 7.0 + tensorflow源码编译安装
在配置个人深度学习主机后,安装必备软件环境成为首要任务。使用Anaconda5.0.0 python3.6版本管理Win python环境,新建基于python3.5的tensorflow-gpu-py conda环境。直接使用conda安装tensorflow,会默认安装tensorflow-gpu 1.1.0并主动安装cudatoolkit8.0 + cudnn6.0。若需配置CUDA环境,需自行下载并安装cuda9.0 + cudnn7.0,配置环境变量。pip安装tensorflow,会默认安装最新版本tensorflow-gpu 1.3.0。配置不当导致import tensorflow时报错:'ModuleNotFoundError: No module named '_pywrap_tensorflow_internal'。尝试源码编译tensorflow解决此问题。
查阅tensorflow官网文档,了解cmake window build tensorflow方法。文档中提到,tensorflow源代码目录下有详细网页介绍Windows环境编译方法,包含重要信息。发现安装tensorflow-gpu版本、配置CUDA8.0 + cuDNN6.0/cuDNN5.1或CUDA9.0 + cuDNN7.0时,import tensorflow时报错。查阅错误信息,网上解答提及需要配置正确的CUDA和cuDNN版本。然而,尝试安装和配置后依然报错。安装tensorflow cpu版本无问题,确认CUDA环境配置错误。
决定源码编译tensorflow-gpu以解决问题。查阅文档,执行编译操作。在window环境下编译tensorflow源码,需要准备的软件包括Git、tensorflow源码、anaconda、swig、CMake、CUDA、cuDNN、Visual Studio 。在百度网盘下载相关软件。
配置过程中,修改CMakeLists.txt以适应CUDA 9.0 + cuDNN 7.0。在cmake目录下新建build文件夹,执行命令配置tensorflow。配置后进行编译,遇到问题如:cudnnSetRNNDescriptor参数不匹配、网络访问问题、编码问题、protobuf库下载问题、zlib.h文件不存在、下载链接失败、无法解决的错误等。
为解决这些问题,采取相应措施,如修改cuda_dnn.cc文件、网络代理设置、文件编码转换、忽略警告信息、多次尝试下载、修改cmake配置文件等。遇到无法解决的问题,如CUDA编译器问题、特定源代码文件问题,提交至github tensorflow进行讨论。
完成源码编译后,安装tensorflow-gpu并进行验证。在下一步中继续讨论验证过程和可能遇到的后续问题。整个编译过程耗时、复杂,需要耐心和细心,希望未来能有官方解决方案以简化编译过程。