從零開始山寨Caffe 零 必先利其器

2021-07-13 08:54:32 字數 3209 閱讀 7313

caffe掌握到一定得階段,站到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其實也不是很難用。

我個人在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:\***\bin

確保bin裡存在需要的dll檔案,否則os會一致提示你缺少dll檔案。

另外,debug和release版本需要的lib檔案和dll檔案均是不同的,不能混用。

一般檔名後補乙個"d",表示這是debug版本的dll/lib。

Django 從零開始

方法1 pip install django 1.6.5 測試是否安裝成功 python import django 1,6,5,final 0 django 使用了 python 標準的 distutils 安裝法,在 linux 平台可能包括如下步驟 tar xzvf django tar.gz...

HTML從零開始

一 標籤 1.使用小寫 2.開始標籤常被稱為開放標籤 opening tag 結束標籤常稱為閉合標籤 closing tag 有效 示例 i reallystrong mean thatem 無效 示例 invalid i reallyem mean thatstrong 二 屬性 1.開始標籤包含...

vim 從零開始

相信大家一開始接觸linux時肯定不知道為什麼要用vim這個奇怪的東西,有各種奇怪的模式,還不如直接用gedit,簡單快捷。有關這個問題大家可以去看知乎大神,今天我在這裡只想記錄一下自己使用vim的過程。雖然vim很強大,但是如果沒用配置最初的狀態是很醜也不怎麼好用的。在配置的過程中,我參考了一下幾...