我只是遇到了同样的问题,似乎Yaroslav Bulatov的建议并不涵盖SSE4.2支持,添加--copt=-msse4.2
就足够了。最后,我成功建立了
bazel build -c opt --copt=-mavx --copt=-mavx2 --copt=-mfma --copt=-mfpmath=both --copt=-msse4.2 --config=cuda -k //tensorflow/tools/pip_package:build_pip_package
没有任何警告或错误。
任何系统的最佳选择可能是:
bazel build -c opt --copt=-march=native --copt=-mfpmath=both --config=cuda -k //tensorflow/tools/pip_package:build_pip_package
( 更新: 构建脚本可能正在吃-march=native
,可能是因为它包含=
。)
-mfpmath=both
仅适用于gcc,不适用于clang。 -mfpmath=sse
可能同样好,甚至更好,它是x86-64的默认值。 32位版本默认为-mfpmath=387
,因此更改该值将对32位有所帮助。 (但是,如果您想要高性能的数字运算,则应该构建64位二进制文件。)
我不确定-O2
或-O3
TensorFlow的默认值是什么。 gcc -O3
可以进行包括自动矢量化在内的全面优化,但这有时会使代码变慢。
这是做什么的:-- --copt
for bazel build
将选项直接传递给gcc来编译C和C ++文件(但没有链接,因此跨文件链接时间优化需要一个不同的选项)
x86-64 gcc默认仅使用SSE2或更旧的SIMD指令,因此您可以在任何 x86-64系统上运行二进制文件。 (请参阅https://gcc.gnu.org/onlinedocs/gcc/x86-Options.html )。那不是你想要的。您想制作一个可以利用CPU可以运行的所有指令的二进制文件,因为您只在构建二进制文件的系统上运行该二进制文件。
-march=native
启用CPU支持的所有选项,因此使-mavx512f -mavx2 -mavx -mfma -msse4.2
冗余。 (此外, -mavx2
已经启用-mavx
和-msse4.2
,因此Yaroslav的命令应该没问题)。同样,如果您使用的CPU不支持这些选项之一(例如FMA),则使用-mfma
会生成一个二进制文件,该文件会因非法指令而出错。
TensorFlow的./configure
默认启用-march=native
,因此使用它应该避免手动指定编译器选项。
-march=native
启用-mtune=native
,因此它会针对您的CPU进行优化,例如哪种AVX指令序列最适合未对齐的负载。
所有这些都适用于gcc,clang或ICC。 (对于ICC,可以使用-xHOST
而不是-march=native
。)
1
这是从运行脚本以检查Tensorflow是否正常运行时收到的消息:
我注意到它提到了SSE4.2和AVX,