如何编译带CPU SSE支持的TensorFlow静态库?性能异常求助
我之前也碰到过一模一样的情况——用tensorflow/contrib/makefile/build_all_linux.sh编译出来的静态库,链接测试程序后性能差得离谱,还会冒出op_kernel相关的错误日志。核心问题确实是默认编译脚本为了兼容更多设备,关闭了CPU指令集优化,没把SSE/AVX这些特性集成进去。给你几个可行的修复步骤:
修改编译脚本的优化参数
打开tensorflow/contrib/makefile/build_all_linux.sh,找到调用make的环节,手动添加CPU优化的编译flag。比如可以在make命令前加上环境变量:CFLAGS="-march=native" CXXFLAGS="-march=native" make -j$(nproc)-march=native会自动适配你当前CPU支持的所有指令集(包括SSE、AVX等),如果需要指定特定版本,比如SSE4.2,就换成-msse4.2。调整Makefile里的优化配置
进入tensorflow/contrib/makefile目录,打开Makefile找到OPTFLAGS变量,把它从默认的低优化等级改成:OPTFLAGS := -O3 -march=native这样整个编译过程都会用最高优化等级和本地CPU指令集,确保静态库能最大化利用硬件性能。
清理旧产物后重新编译
先把之前编译的残留文件清掉:cd tensorflow/contrib/makefile && make clean然后重新运行
build_all_linux.sh完成编译。编译完成后可以用objdump验证是否包含SSE指令:objdump -d libtensorflow-core.a | grep -i sse如果输出里能看到SSE相关的指令,说明优化已经生效。
测试程序也要同步用优化参数编译
链接静态库的时候,你的测试程序本身也得用相同的优化flag编译,不然单靠库优化也达不到最佳效果。比如编译测试程序时加上:g++ -march=native test.cpp -o test -ltensorflow-core -L/path/to/lib
你看到的op_kernel错误日志,本质是因为缺少CPU优化导致部分内核无法高效执行,开启上述优化后这个问题也会随之缓解。
内容的提问来源于stack exchange,提问作者Ivan Jobs

