caffe 加入 cudnn编译
首先要使用cudnn v2,
ALL PLATFORMS
? ? Extract the cuDNN archive to a directory of your choice, referred to below as <installpath>.
? ? Then follow the platform-specific instructions as follows.
LINUX
? ? cd <installpath>
? ? export LD_LIBRARY_PATH=`pwd`:$LD_LIBRARY_PATH
? ? Add <installpath> to your build and link process by adding -I<installpath> to your compile
? ? line and -L<installpath> -lcudnn to your link line.
注意的是
在Makefile中新添的語句要在之前的前面
LDFLAGS += -L/home/research/sunmeng/software/cudnn-6.5-linux-x64-v2 -lcudnn
LDFLAGS += $(foreach librarydir,$(LIBRARY_DIRS),-L$(librarydir)) $(PKG_CONFIG) \
? ? ? ? ?$(foreach library,$(LIBRARIES),-l$(library))
//
遇到的一個問題是把caffe編譯為一個動態(tài)鏈接庫,其他程序調用caffe.so時,也需要加載cudnn.so,則編譯選項添加?-L/usr/local/cuda/lib64 -L/home/xxxxx/cudnn-6.5-linux-x64-v2/?
一直提示是undefined reference to `cudnnGetConvolutionForwardWorkspaceSize' 之類的錯誤,這是因為在動態(tài)鏈接庫中找不到相應的函數(shù)實現(xiàn)
這是因為之前在?/usr/local/cuda/lib64目錄下拷貝了一個老版本的cudnn.so, 而我們想要使用的是新版本的/home/xxxxx/cudnn-6.5-linux-x64-v2,g++先在lib64找,找到了就不在后面的目錄找了,解決這個問題很簡單,就是把兩個目錄的順序調換即可
///
程序在運行時就要需要加載動態(tài)鏈接庫了,原理參考
http://blog.sina.com.cn/s/blog_484102dd0101114f.html
所以安裝共享庫后要注意共享庫路徑設置問題, 如下:
1) 如果共享庫文件安裝到了/lib或/usr/lib目錄下, 那么需執(zhí)行一下ldconfig命令
ldconfig命令的用途, 主要是在默認搜尋目錄(/lib和/usr/lib)以及動態(tài)庫配置文件/etc/ld.so.conf內(nèi)所列的目錄下, 搜索出可共享的動態(tài)鏈接庫(格式如lib*.so*), 進而創(chuàng)建出動態(tài)裝入程序(ld.so)所需的連接和緩存文件. 緩存文件默認為/etc/ld.so.cache, 此文件保存已排好序的動態(tài)鏈接庫名字列表.?
2) 如果共享庫文件安裝到了/usr/local/lib(很多開源的共享庫都會安裝到該目錄下)或其它"非/lib或/usr/lib"目錄下, 那么在執(zhí)行l(wèi)dconfig命令前, 還要把新共享庫目錄加入到共享庫配置文件/etc/ld.so.conf中, 如下:
#?cat /etc/ld.so.conf
include ld.so.conf.d/*.conf
#?echo "/usr/local/lib" >> /etc/ld.so.conf
#?ldconfig
3) 如果共享庫文件安裝到了其它"非/lib或/usr/lib" 目錄下,? 但是又不想在/etc/ld.so.conf中加路徑(或者是沒有權限加路徑). 那可以export一個全局變量LD_LIBRARY_PATH, 然后運行程序的時候就會去這個目錄中找共享庫.?
LD_LIBRARY_PATH的意思是告訴loader在哪些目錄中可以找到共享庫. 可以設置多個搜索目錄, 這些目錄之間用冒號分隔開. 比如安裝了一個mysql到/usr/local/mysql目錄下, 其中有一大堆庫文件在/usr/local/mysql/lib下面, 則可以在.bashrc或.bash_profile或shell里加入以下語句即可:
export LD_LIBRARY_PATH=/usr/local/mysql/lib:$LD_LIBRARY_PATH????
一般來講這只是一種臨時的解決方案, 在沒有權限或臨時需要的時候使用.
當然也可以將動態(tài)鏈接庫的地址寫入到可執(zhí)行文件中去,這樣在運行程序的時候就不用考慮動態(tài)鏈接庫的地址了,注意,最好是絕對路徑,就是在編譯中添加?
-Wl,-rpath,/home/xxxx/cudnn-6.5-linux-x64-v2:/usr/local/cuda/lib64:
總結
以上是生活随笔為你收集整理的caffe 加入 cudnn编译的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux下使用protobuf实现简单
- 下一篇: cuda-convnet2编译