从零开始山寨Caffe·零:必先利其器
工作環(huán)境
巧婦有了米炊
眾所周知,Caffe是在Linux下寫的,所以長(zhǎng)久以來(lái),大家都認(rèn)為跑Caffe,先裝Linux。
niuzhiheng大神發(fā)起了caffe-windows項(xiàng)目(解決了一些編譯、API相異問(wèn)題)
以及willyd大神發(fā)起的caffe-windows-dependencies項(xiàng)目(整理了依賴庫(kù),修正了LMDB在NTFS分區(qū)的Bug)
我們現(xiàn)在可以很歡樂(lè)地在Windows上研究Caffe源碼,以及山寨它了。
編輯器
在Windows下涉及CUDA,Visual Studio必然是首選。如果問(wèn)原因,這是NVIDIA官方的推薦。
CUDA最初使用的語(yǔ)言,除了二進(jìn)制機(jī)器碼,就是類似CPU匯編的,GPU匯編——PTX代碼。
后來(lái)NVIDIA的工程師寫了C接口,編譯器稱為NVCC。
NVCC相當(dāng)有趣,它在編譯前,需要對(duì)CUDA代碼以及傳統(tǒng)C/C++代碼做分離。
這一步給模板(Template)分離式編程帶來(lái)比較大的麻煩,C/C++編譯器和NVCC編譯器不共享某些知識(shí),
所以你需要重復(fù)某些代碼。(幸好我們有宏)
?
CUDA的地位與DirectX差不多,后者是MS為GPU封裝的C++接口。
CUDA、OpenCL、DirectX旗下的Direct Compute并稱為GPGPU通用計(jì)算的三個(gè)小王子。
當(dāng)然,CUDA屬于那種為了奪嫡開掛的小人,目前你看到的CUDA框架,只限于NVIDIA GPU,
因?yàn)樗谠O(shè)計(jì)的時(shí)候,沒(méi)有從通用GPU出發(fā),直接在自家的硬件物理架構(gòu)上設(shè)計(jì),所以優(yōu)勢(shì)很大。
?
再說(shuō)Windows,玩過(guò)游戲的人都知道,NVIDIA和MS是多年友商了。
玩游戲有句信條:千萬(wàn)不要用Linux。這句話可以從兩方面解釋:
(I) NVIDIA為Windows全心全意做驅(qū)動(dòng)程序,證據(jù)是Linux裝顯卡驅(qū)動(dòng)曾經(jīng)
是一個(gè)老大難問(wèn)題,無(wú)數(shù)人抱怨,“NVIDIA就是MS的奸細(xì)”。
(II) 很少有開發(fā)者用Linux API寫游戲(PC端)
這個(gè)現(xiàn)象最近有所改觀,基礎(chǔ)驅(qū)動(dòng)和CUDA也為部分Linux提供了支持(Ubuntu)。
就連CES2016上,老黃演示無(wú)人駕駛系統(tǒng)Drive PX 2 Demo居然也是跑在Linux(Ubuntu)上。
似乎還被人看出來(lái)跑的是Caffe(疑似),但不論則么說(shuō),NVIDIA現(xiàn)在是對(duì)Linux有所關(guān)注了。
?
為了體現(xiàn)與MS的友誼,CUDA幾乎是與Visual Studio捆綁的,前提你得先裝VS。
CUDA會(huì)把插件和配置直接自動(dòng)寫到VS里去。
配置NVCC和以及傳統(tǒng)C/C++編譯器相當(dāng)繁瑣,如果你是民間大神,可以嘗試Vim或Sublime。
但是,最好不要這么作死,VS其實(shí)也不是很難用。
OS及VS
我個(gè)人在Windows10 Threshold 1下工作。
VS使用是Metro先鋒VS2013,相當(dāng)老掉牙的版本。(VS 2012及以下的UI相當(dāng)丑,因?yàn)橥?月才出了Windows8)。
VS的默認(rèn)工作模式是X64 Release。
依賴環(huán)境庫(kù)
你的VS工作環(huán)境,決定了你的依賴庫(kù)是如何使用的。
依賴庫(kù)有“大三元”的說(shuō)法:
如圖,就是這三個(gè)目錄,分別存著:動(dòng)態(tài)庫(kù)、引用頭文件,靜態(tài)庫(kù)。
(I)先說(shuō)說(shuō)靜態(tài)庫(kù),VS的靜態(tài)庫(kù)是lib文件,GCC的靜態(tài)庫(kù)是a文件。
靜態(tài)庫(kù)只能在編譯階段的鏈接器中使用,這與C/C++的分離式編程有關(guān)。
眾所周知,C/C++倡導(dǎo)聲明定義分離,這大大加快了整體編譯速度,以及方便外部調(diào)用。
于是編譯階段分為兩部門:先進(jìn)行聲明的分析,然后再把定義填充進(jìn)去。
聲明的全部?jī)?nèi)容通常是提供給外部的,是由零碎的頭文件組成,你想用就#include就好了。
定義的內(nèi)容,會(huì)被鏈接器灌裝起來(lái)。根據(jù)灌裝模式的不同,就出現(xiàn)了靜態(tài)編譯和動(dòng)態(tài)編譯兩類。
根據(jù)生成內(nèi)容的不同,又可以分為可執(zhí)行文件生成和庫(kù)生成兩類。
利用笛卡爾積,我們大概得到四種模式:
★庫(kù)生成,靜態(tài)編譯( h文件+lib文件(VC) 或者h(yuǎn)文件+a文件(GCC) )
★庫(kù)生成,動(dòng)態(tài)編譯? (不存在)
★可執(zhí)行文件生成,靜態(tài)編譯 (exe文件)
★可執(zhí)行文件生成,動(dòng)態(tài)編譯 ( exe文件+dll or bin文件+so文件(Linux) )
其中第二種方式是不存在的。所以針對(duì)庫(kù)生成而言,我們只需要h+lib/a文件即可。
它們應(yīng)當(dāng)分別放到include和lib文件夾中。
?
在VS中配置頭文件/靜態(tài)庫(kù)很簡(jiǎn)單,分為兩步:
★在工程屬性-VC++目錄中指定"包含目錄"以及”庫(kù)目錄“,分別為h目錄以及l(fā)ib目錄
★在工程屬性-鏈接器-輸入中,手動(dòng)添加需要的lib文件
第二步相當(dāng)重要,如果不做,那么編譯是不會(huì)錯(cuò)的,但是在鏈接定義的時(shí)候,會(huì)找不到lib中的定義:
error LNK2001: 無(wú)法解析的外部符號(hào)
如果你的lib目錄沒(méi)錯(cuò),那么試著找一找,是不是沒(méi)有手動(dòng)添加lib文件(VS不會(huì)自動(dòng)掃描目錄文件并且添加)
?
(II)再說(shuō)說(shuō)動(dòng)態(tài)庫(kù),這個(gè)方式只有在選擇了Release模式編譯之后,才會(huì)使用。
先說(shuō)說(shuō)Debug和Release的區(qū)別。
Debug版本一般不用來(lái)發(fā)布,不僅是因?yàn)槔锩姘薉ebug代碼,而且沒(méi)有做編譯優(yōu)化,性能有折扣。
但是有一點(diǎn)好處,就是可以斷點(diǎn)、調(diào)試,但這非常麻煩。
由于外部依賴庫(kù)的灌裝,你要Debug你的程序,需要提供pdb符號(hào)文件,這意味著你得自己把所有依賴庫(kù)
自己編譯一遍,得到pdb文件,否則無(wú)法Debug,也就無(wú)法斷點(diǎn)調(diào)試。
因?yàn)闊o(wú)法斷點(diǎn),所以Debug只能靠人工推理出斷點(diǎn)(推測(cè)可能位置,加cout/printf語(yǔ)句測(cè)試)
還有一點(diǎn),就是Debug版本在調(diào)試模式中的執(zhí)行只需要lib文件,如圖:
但是,一旦你把Debug版本的exe文件拿到別處,就需要dll文件了,這時(shí)候需要?jiǎng)討B(tài)庫(kù)。
Release版本則是強(qiáng)制使用動(dòng)態(tài)庫(kù),就算是調(diào)試模式也無(wú)效。
?
在VS中配置動(dòng)態(tài)庫(kù)很簡(jiǎn)單,只要一步
★在工程屬性-調(diào)試中,指定"環(huán)境"的值為:PATH=%PATH%;C:\xxx\bin
確保bin里存在需要的dll文件,否則OS會(huì)一致提示你缺少dll文件。
?
另外,Debug和Release版本需要的lib文件和dll文件均是不同的,不能混用。
一般文件名后補(bǔ)一個(gè)"d",表示這是Debug版本的dll/lib。
教學(xué)用·快速依賴環(huán)境包
這個(gè)包僅教學(xué)使用,閹割龐大的Boost,直接無(wú)視了OpenCV(這東西其實(shí)沒(méi)多大用)。
對(duì)于山寨Caffe,足夠了。僅僅30MB,適合傻瓜。
強(qiáng)調(diào),請(qǐng)用于: X64 Release
度娘:http://pan.baidu.com/s/1NeDrS
有問(wèn)題郵箱@我:neopenx@mail.hfut.edu.cn
?
2016.2.18 更新lmdb.lib
-修正Win32平臺(tái)下,set end of file error!的輸出信息問(wèn)題
解決方案是在lmdb源碼的mdb.c里把這句printf注釋掉。
這是一句毫無(wú)意義的輸出信息,僅僅在Windows平臺(tái)下被編譯出來(lái),強(qiáng)迫癥患者可以選擇嘗試。
度娘:http://pan.baidu.com/s/1sk29YlJ
?
總結(jié)
以上是生活随笔為你收集整理的从零开始山寨Caffe·零:必先利其器的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 解决npm 下载速度慢的问题
- 下一篇: Caffe2 Compilation E