从零开始山寨Caffe·零:必先利其器

工作环境

巧妇有了米炊

众所周知,Caffe是在Linux下写的,所以长久以来,大家都认为跑Caffe,先装Linux。

niuzhiheng大神发起了caffe-windows项目(解决了一些编译、API相异问题)

以及willyd大神发起的caffe-windows-dependencies项目(整理了依赖库,修正了LMDB在NTFS分区的Bug)

我们现在可以很欢乐地在Windows上研究Caffe源码,以及山寨它了。

编辑器

在Windows下涉及CUDA,Visual Studio必然是首选。如果问原因,这是NVIDIA官方的推荐。

CUDA最初使用的语言,除了二进制机器码,就是类似CPU汇编的,GPU汇编——PTX代码。

后来NVIDIA的工程师写了C接口,编译器称为NVCC。

NVCC相当有趣,它在编译前,需要对CUDA代码以及传统C/C++代码做分离。

这一步给模板(Template)分离式编程带来比较大的麻烦,C/C++编译器和NVCC编译器不共享某些知识,

所以你需要重复某些代码。(幸好我们有宏)

 

CUDA的地位与DirectX差不多,后者是MS为GPU封装的C++接口。

CUDA、OpenCL、DirectX旗下的Direct Compute并称为GPGPU通用计算的三个小王子。

当然,CUDA属于那种为了夺嫡开挂的小人,目前你看到的CUDA框架,只限于NVIDIA GPU,

因为它在设计的时候,没有从通用GPU出发,直接在自家的硬件物理架构上设计,所以优势很大。

 

再说Windows,玩过游戏的人都知道,NVIDIA和MS是多年友商了。

玩游戏有句信条:千万不要用Linux。这句话可以从两方面解释:

(I) NVIDIA为Windows全心全意做驱动程序,证据是Linux装显卡驱动曾经

是一个老大难问题,无数人抱怨,“NVIDIA就是MS的奸细”。

(II) 很少有开发者用Linux API写游戏(PC端)

这个现象最近有所改观,基础驱动和CUDA也为部分Linux提供了支持(Ubuntu)。

就连CES2016上,老黄演示无人驾驶系统Drive PX 2 Demo居然也是跑在Linux(Ubuntu)上。

似乎还被人看出来跑的是Caffe(疑似),但不论则么说,NVIDIA现在是对Linux有所关注了。

 

为了体现与MS的友谊,CUDA几乎是与Visual Studio捆绑的,前提你得先装VS。

CUDA会把插件和配置直接自动写到VS里去。

配置NVCC和以及传统C/C++编译器相当繁琐,如果你是民间大神,可以尝试Vim或Sublime。

但是,最好不要这么作死,VS其实也不是很难用。

OS及VS

我个人在Windows10 Threshold 1下工作。

VS使用是Metro先锋VS2013,相当老掉牙的版本。(VS 2012及以下的UI相当丑,因为同年8月才出了Windows8)。

VS的默认工作模式是X64 Release。

依赖环境库

你的VS工作环境,决定了你的依赖库是如何使用的。

依赖库有“大三元”的说法:

如图,就是这三个目录,分别存着:动态库、引用头文件,静态库。

(I)先说说静态库,VS的静态库是lib文件,GCC的静态库是a文件。

静态库只能在编译阶段的链接器中使用,这与C/C++的分离式编程有关。

众所周知,C/C++倡导声明定义分离,这大大加快了整体编译速度,以及方便外部调用。

于是编译阶段分为两部门:先进行声明的分析,然后再把定义填充进去。

声明的全部内容通常是提供给外部的,是由零碎的头文件组成,你想用就#include就好了。

定义的内容,会被链接器灌装起来。根据灌装模式的不同,就出现了静态编译和动态编译两类。

根据生成内容的不同,又可以分为可执行文件生成和库生成两类。

利用笛卡尔积,我们大概得到四种模式:

★库生成,静态编译( h文件+lib文件(VC) 或者h文件+a文件(GCC) )

★库生成,动态编译  (不存在)

★可执行文件生成,静态编译 (exe文件)

★可执行文件生成,动态编译 ( exe文件+dll or bin文件+so文件(Linux) )

其中第二种方式是不存在的。所以针对库生成而言,我们只需要h+lib/a文件即可。

它们应当分别放到include和lib文件夹中。

 

在VS中配置头文件/静态库很简单,分为两步:

★在工程属性-VC++目录中指定"包含目录"以及”库目录“,分别为h目录以及lib目录

★在工程属性-链接器-输入中,手动添加需要的lib文件

第二步相当重要,如果不做,那么编译是不会错的,但是在链接定义的时候,会找不到lib中的定义:

error LNK2001: 无法解析的外部符号

如果你的lib目录没错,那么试着找一找,是不是没有手动添加lib文件(VS不会自动扫描目录文件并且添加)

 

(II)再说说动态库,这个方式只有在选择了Release模式编译之后,才会使用。

先说说Debug和Release的区别。

Debug版本一般不用来发布,不仅是因为里面包含了Debug代码,而且没有做编译优化,性能有折扣。

但是有一点好处,就是可以断点、调试,但这非常麻烦。

由于外部依赖库的灌装,你要Debug你的程序,需要提供pdb符号文件,这意味着你得自己把所有依赖库

自己编译一遍,得到pdb文件,否则无法Debug,也就无法断点调试。

因为无法断点,所以Debug只能靠人工推理出断点(推测可能位置,加cout/printf语句测试)

还有一点,就是Debug版本在调试模式中的执行只需要lib文件,如图:

但是,一旦你把Debug版本的exe文件拿到别处,就需要dll文件了,这时候需要动态库。

Release版本则是强制使用动态库,就算是调试模式也无效。

 

在VS中配置动态库很简单,只要一步

★在工程属性-调试中,指定"环境"的值为:PATH=%PATH%;C:\xxx\bin

确保bin里存在需要的dll文件,否则OS会一致提示你缺少dll文件。

 

另外,Debug和Release版本需要的lib文件和dll文件均是不同的,不能混用。

一般文件名后补一个"d",表示这是Debug版本的dll/lib。

教学用·快速依赖环境包

这个包仅教学使用,阉割庞大的Boost,直接无视了OpenCV(这东西其实没多大用)。

对于山寨Caffe,足够了。仅仅30MB,适合傻瓜。

强调,请用于: X64 Release

度娘:http://pan.baidu.com/s/1NeDrS

有问题邮箱@我:neopenx@mail.hfut.edu.cn

 

2016.2.18 更新lmdb.lib

-修正Win32平台下,set end of file error!的输出信息问题

解决方案是在lmdb源码的mdb.c里把这句printf注释掉。

这是一句毫无意义的输出信息,仅仅在Windows平台下被编译出来,强迫症患者可以选择尝试。

度娘:http://pan.baidu.com/s/1sk29YlJ

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/262015.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python单例_Python - 单例模式(Singleton)

单例模式(Singleton) 本文地址: http://blog.csdn.net/caroline_wendy/article/details/23374575 单例模式 , 类的实例从始至终, 只 被创建一次 , 这些类可以用来管理一些资源; 需要 继承Object类 , 才可以使用类的方法 super() , 只实例化一次; 参见Python文档: Note super() …

Linux抓eth0网卡包的命令,Linux系统使用tcpdump命令抓包

前提条件:1. 一台安装有Linux的机器….这个是必要的;2. Tcpdump程序;3. 以下所有均是root用户登录操作,且命令不支持直接复制到Linux控制台,请手工输入!4.工具以及教程文档下载地址 点我操作步骤&#xff1a…

SilverLight非托管代码的初始化进度条方法

SilverLight非托管代码的初始化进度条方法 <script type"text/javascript"> 错误处理函数 function onSilverlightError(sender, args) ... //下载进度函数 function onSourceDownloadProgressChanged(sender, eventArgs) { sender.findN…

超全的学习资料——Oracle 从入门到精通

Oracle 从入门到精通 目录 一、SQL...................................................................................................................................................8 1.1、基本概念&#xff1a;..................................................…

common-collections中Java反序列化漏洞导致的RCE原理分析

2019独角兽企业重金招聘Python工程师标准>>> common-collections中Java反序列化漏洞导致的RCE原理分析 隐形人真忙 2015/11/11 22:40 0x00 背景 这几天在zone看到了有人提及了有关于common-collections包的RCE漏洞&#xff0c;并且http://zone.wooyun.org/content/…

linux nfs 配置_centos7 NFS 配置

NFS是什么最近项目上有这么个需求&#xff0c;客户端上传文件的时候&#xff0c;想把文件上传到另外一台服务器。本来想用ftp的&#xff0c;觉得太麻烦&#xff0c;就各种查资料&#xff0c;请教别人&#xff0c;后来发现&#xff0c;NFS这个东东真不错。NFS(网络文件系统)服务…

linux命令 waf,常用waf命令

常用waf命令一、配置及编译&#xff1a;$ ./waf configure [option]$ ./waf帮助&#xff1a; $ ./waf --help配置调试&#xff0c;优化调试&#xff1a;$ ./waf -d configure: debug,optimized改变flag: $ CXXFLAGS"-O3" ./waf configure或者&#xff1a; $CXXg-…

Windows Server 2003 导入Java生成的证书,保证iis对CAS的访问

开始 -- 运行-- mmc 打开了一个控制台程序 菜单 --> 文件 --> 添加/删除管理单元 (Ctrl M) 打开界面: 点击 "添加" 按钮,打开界面后选择 "证书",继续点此界面的添加,完成添加证书管理的操作 中间需要选择账户,我就选择的是 我的用户账户, 也可…

shell命令tree

在Windwows下很喜欢tree命令&#xff0c;在CenntOS下也有这条命令&#xff0c;在网上找到了源代码和一段简单的脚本&#xff0c; 完整的tree源代码可以在这里下载&#xff1a; ftp://mama.indstate.edu/linux/tree/ 简易的tree脚本如下&#xff1a; #!/bin/sh ################…

ulimit

ulimit用于shell启动进程所占用的资源. ulimit [-acdfHlmnpsStvw] [size] -H 设置硬资源限制.-S 设置软资源限制.-a 显示当前所有的资源限制.-c size:设置core文件的最大值.单位:blocks-d size:设置数据段的最大值.单位:kbytes-f size:设置创建文件的最大值.单位:blocks-l size…

命令点亮硬盘灯_macOS下移动硬盘无法挂载且硬盘灯一直闪烁的解决方法

致力于成为您终身的苹果管家点击上方蓝字 关注我们小编近日遇到一个诡异的问题&#xff0c;小编的移动硬盘不定期的会自动断开&#xff0c;提示未正常拔出&#xff0c;实际上一直没有动过连接线&#xff0c;然后硬盘一直处于未加载的状态&#xff0c;硬盘灯也一直闪烁不停。通…

linux 挂载多余空间,linux 空间不够,磁盘挂载

1.给新的磁盘分区fdisk /dev/sdb2.格式化新的磁盘分区mkfs.ext4 /dev/sdb13挂载磁盘到sdb1mount /dev/sdb1 /mnt/sdb1/4系统自动挂载vim /etc/fstab/dev/mapper/VolGroup-lv_root / ext4 defaults 1 1UUID5714863f-0d34-4269-8c9f-59d48af70cb…

常用正则表达式,来自新浪微博的js

STK.register("common.setting.rule", function(a) { var b {}; b.isEmpty function(a) { return /^\s*$/g.test(a.replace(/^\s|\s$/g, "")) }; b.isNumber function(a) { return /^[\-]?\d(\.\d)?$/.test(a) }; b.isName function(a) { return /^[…

转:VC9(VC2008.net) 编译安装 boost 1.39 库

简介Boost库是一个经过千锤百炼、可移植、提供源代码的C库&#xff0c;&#xff0c;作为标准库的后备&#xff0c;是C 标准化进程的发动机之一。 Boost库由C标准委员会库工作组成员发起&#xff0c;其中有些内容有望成为下一代C标准库内容。在C社区中影响甚大&#xff0c;其成 …

如何在跑cts的时候生成log_为什么要买奥铃CTS?听听用户的评价

【原创首发】本文系商车邦原创文章文/芦齐 【商车邦导读】沧州用户的一致好评并非偶然&#xff0c;而是奥铃在轻卡领域深耕细作的必然。初次来到沧州黄骅&#xff0c;就能感受到这座海鲜小城浓浓的“海”味。海鲜曾经是内陆稀有的食材&#xff0c;如今随着人民生活水平的提高&a…

linux要求关闭httpd服务,Apache2.4.4的安装及实现service和chkconfig系统控制httpd开启关闭...

Apache2.4.4的安装及实现service和chkconfig系统控制httpd开启关闭不废话了&#xff0c;根据apache2.4.4的手册我们知道还要有三个准备包&#xff0c;如下&#xff1a; apr-1.4.6.tar.bz2 apr-uti-1.5.1.tar.bz2和pcre-8.32.tar.bz2安装apr# tar -jxvf apr-1.4.6.tar.bz2# cd…

帮助你生成响应式布局的CSS模板 - xyCSS

日期&#xff1a;2013-1-31 来源&#xff1a;GBin1.com 在线演示 在前面的文章中我们介绍了响应式的网格profound grid&#xff0c;用来帮助你开发固定或者响应式的流动布局设计&#xff0c;如果你希望使用纯CSS生成响应式的布局的话&#xff0c;相信xyCSS将会是一个不错的选择…

WPF中设置ListView的Items颜色交替显示

2008/02/28 17:32i当ListView绑定数据源后,这个效果让我无从下手, 这个问题一直困扰着我,后来我在CSDN上发贴求助,问题终于得以解决,这是一位大大给的回复: 以下各节提供了三种方法&#xff0c;用于创建各行的 Background 颜色具有交替效果的 ListView。该示例还论述用于在添加…

python字符串内建函数_python字符串内建函数

操作符描述实例字符串连接 a b 输出结果&#xff1a; HelloPython * 重复输出字符串 a*2 输出结果&#xff1a;HelloHello [] 通过索引获取字符串中字符 a[1] 输出结果 e [ : ] 截取字符串中的一部分 a[1:4] 输出结果ell in 成员运算符 - 如果字符串中包含给定的字符返回 True…

Facebook开源动画库 POP-POPBasicAnimation运用

动画在APP开发过程中还是经常出现&#xff0c;将花几天的时间对Facebook开源动画库 POP进行简单的学习&#xff1b;本文主要针对的是POPBasicAnimation运用&#xff1b;实例源代码已经上传至gitHub,地址&#xff1a;https://github.com/wujunyang/facebookPopTest Pop Github :…