Ubuntu下编译的dlib运行速度远慢于Windows的问题求助
排查Ubuntu 16.04下dlib dnn/svm模块运行速度慢的思路
针对你遇到的Ubuntu下dlib dnn/svm模块跑起来比Windows慢好几倍的问题,结合你的环境和编译步骤,我整理了几个实用的排查方向,你可以逐一验证:
1. 确认AVX指令集是否真的生效
虽然你在CMake里勾选了USE_AVX_INSTRUCTIONS,但gcc 5.4对AVX的支持可能存在细节问题,导致优化没真正落地:
- 尝试在编译时追加
-mavx2参数(如果你的CPU支持AVX2),dlib不少核心优化是基于AVX2的,gcc 5.4本身支持这个指令集; - 用
objdump -d查看编译好的dlib库文件,搜索vpxor、vperm2i128这类AVX/AVX2特征指令,如果几乎找不到,说明AVX优化没生效; - 写个小代码片段检测运行时的指令集支持:
#include <iostream> #include <dlib/cpu_detection.h> int main() { std::cout << "AVX supported: " << dlib::cpu_supports_avx() << std::endl; std::cout << "AVX2 supported: " << dlib::cpu_supports_avx2() << std::endl; return 0; }
编译运行后,确认CPU和编译后的二进制确实能识别AVX指令。
2. 验证OpenMP多线程是否正常工作
你提到编译时用到了OpenMP,但Ubuntu下可能默认没开启多线程,或者线程数配置不合理:
- 运行程序时用
htop或ps -eLf | grep 你的程序名查看是否有多个线程在运行,如果只有单线程,说明OpenMP没生效; - 手动设置OpenMP线程数:运行程序前执行
export OMP_NUM_THREADS=$(nproc),把线程数拉满到CPU核心数,再测试速度; - 检查编译参数:看你贴的编译命令里没看到
-fopenmp,dlib链接MKL时可能需要显式指定这个选项,你可以查看CMake的输出日志,确认是否有-fopenmp被加入到编译和链接环节。
3. 排查MKL的配置与性能
虽然安装了MKL,但Ubuntu下的环境变量或链接可能没配置对,导致MKL没发挥性能:
- 运行程序前先加载MKL的环境变量:执行
source /opt/intel/mkl/bin/mklvars.sh intel64,确保MKL的库和头文件路径被系统正确识别; - 测试MKL的BLAS/LAPACK性能:编译运行dlib自带的
dlib/test/blas_speed_test.cpp,对比Windows下的测试结果,看MKL在Ubuntu下是否正常工作; - 检查依赖库:用
ldd 你的程序名查看程序依赖的BLAS/LAPACK库,确认是MKL的libmkl_rt.so,而不是系统默认的libopenblas.so或libblas.so。
4. 优化编译器设置与版本
gcc 5.4的优化能力和Windows下的MSVC可能有差异,或者你还没用到最优的编译选项:
- 尝试追加
-march=native参数,让gcc针对你的CPU型号做最大化优化(注意这个选项会让二进制只能在同架构CPU上运行); - 考虑升级gcc版本:Ubuntu 16.04可以通过ppa安装gcc 6.x或7.x,较新的gcc版本对AVX优化、自动矢量化的支持更好,重新编译dlib后再测试速度。
5. 检查系统层面的性能限制
Ubuntu系统本身的节能设置或资源限制也可能拖慢速度:
- 检查CPU频率:用
cpufreq-info查看CPU是否运行在最高频率,如果是节能模式导致降频,可以临时切换到性能模式:echo performance | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor; - 检查内存使用:用
free -h查看内存情况,如果程序运行时物理内存不足导致swap频繁读写,速度会骤降,确保有足够的物理内存供程序使用。
内容的提问来源于stack exchange,提问作者facug91
相关产品推荐
相关产品推荐

