編譯OpenBLAS
OpenBLAS編譯可以參照官網(wǎng):https://github.com/xianyi/OpenBLAS
需要注意的是編譯時需加入USE_OPENMP=1 選項使用OpenMP 編譯漫贞,不然caffe的并行化執(zhí)行效率會受很大影響憔杨,我的系統(tǒng)而言球散,不使用OpenMP的話在4線程下運行mnist示例已經(jīng)如便秘一般,比單核慢很多督惰。而使能了OpenMP之后情況好轉(zhuǎn)不少,后面會貼出不同線程數(shù)的運行時間旅掂。
$ make USE_OPENMP=1
$ sudo make install PREFIX=/opt/OpenBLAS.OpenMP #默認(rèn)是/opt/OpenBLAS.
編譯Caffe
編譯caffe需要注意以下幾點赏胚,更改Makefile.config:
- CPU_ONLY
CPU_ONLY := 1
- BLAS
BLAS := open
BLAS_INCLUDE := /opt/OpenBLAS.OpenMP/include
BLAS_LIB := /opt/OpenBLAS.OpenMP/lib
編譯環(huán)境設(shè)置
export LD_LIBRARY_PATH=/opt/OpenBLAS.OpenMP/lib:/usr/local/lib:/usr/local/lib64:/usr/lib:/usr/lib64:/lib64
export LIBRARY_DIRS=$LD_LIBRARY_PATH
export INCLUDE=/opt/OpenBLAS.OpenMP/include:/usr/include:/usr/include/gflags
export INCLUDE_DIRS=$INCLUDE
多線程優(yōu)化結(jié)果
使用OpenMP的情況下,多核下性能會有些提升商虐,太多的話效率反而會降低觉阅。我使用mnist 的examples/mnist/train_lenet.sh 進行測試,為使用CPU計算和減少等待秘车,做了如下改動:
# edit examples/mnist/lenet_solver.prototxt
max_iter: 1000
snapshot: 500
solver_mode: CPU
在使能OpenMP編譯OpenBLAS之后典勇,運行時使用多線程需要用下面這個環(huán)境變量指定:
export OMP_NUM_THREADS=4
下面是不同線程數(shù)的測試結(jié)果。
線程數(shù) | 運行時間(s) - OpenMP | 運行時間(s) - No OpenMP |
---|---|---|
1 | 89 | 89 |
2 | 66 | 72 |
4 | 52 | 420 |
8 | 49 | |
16 | 51 | |
32 | 77叮趴,error log: double free or corruption |