编译OpenBLAS
OpenBLAS编译可以参照官网:https://github.com/xianyi/OpenBLAS
需要注意的是编译时需加入USE_OPENMP=1 选项使用OpenMP 编译,不然caffe的并行化执行效率会受很大影响,我的系统而言,不使用OpenMP的话在4线程下运行mnist示例已经如便秘一般,比单核慢很多。而使能了OpenMP之后情况好转不少,后面会贴出不同线程数的运行时间。
$ make USE_OPENMP=1
$ sudo make install PREFIX=/opt/OpenBLAS.OpenMP #默认是/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
编译环境设置
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
多线程优化结果
使用OpenMP的情况下,多核下性能会有些提升,太多的话效率反而会降低。我使用mnist 的examples/mnist/train_lenet.sh 进行测试,为使用CPU计算和减少等待,做了如下改动:
# edit examples/mnist/lenet_solver.prototxt
max_iter: 1000
snapshot: 500
solver_mode: CPU
在使能OpenMP编译OpenBLAS之后,运行时使用多线程需要用下面这个环境变量指定:
export OMP_NUM_THREADS=4
下面是不同线程数的测试结果。
线程数 | 运行时间(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 |