我刚刚遇到了同样的问题,似乎 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
(Update: 构建脚本可能正在吃东西-march=native,可能是因为它包含一个=
.)
-mfpmath=both
只适用于 gcc,不适用于 clang。-mfpmath=sse
可能同样好,甚至更好,并且是 x86-64 的默认值。 32 位构建默认为-mfpmath=387
,因此更改它对于 32 位会有帮助。 (但是如果您想要高性能的数字处理,您应该构建 64 位二进制文件。)
我不确定 TensorFlow 的默认值是什么-O2
or -O3
is. gcc -O3
可以实现包括自动矢量化在内的全面优化,但这有时会使代码变慢。
这是做什么的:--copt for bazel build直接向 gcc 传递一个选项以编译 C 和 C++ 文件(但不链接,因此您需要一个不同的选项来进行跨文件链接时间优化)
x86-64 gcc 默认仅使用 SSE2 或更旧的 SIMD 指令,因此您可以在anyx86-64 系统。 (看https://gcc.gnu.org/onlinedocs/gcc/x86-Options.html)。那不是你想要的。您想要制作一个利用 CPU 可以运行的所有指令的二进制文件,因为您只在构建它的系统上运行该二进制文件。
-march=native
启用您的CPU支持的所有选项,因此它使得-mavx512f -mavx2 -mavx -mfma -msse4.2
多余的。 (还,-mavx2
已经启用-mavx
and -msse4.2
,所以雅罗斯拉夫的命令应该没问题)。另外,如果您使用的 CPU 不支持这些选项之一(例如 FMA),请使用-mfma
会生成一个因非法指令而出错的二进制文件。
TensorFlow 的./configure默认启用-march=native,因此使用它应该避免需要手动指定编译器选项。
-march=native
使-mtune=native
, so 它针对您的 CPU 进行优化对于诸如哪种 AVX 指令序列最适合未对齐负载之类的问题。
这都适用于 gcc、clang 或 ICC。 (对于 ICC,您可以使用-xHOST
代替-march=native
.)