<p>我刚刚遇到了同样的问题,Yaroslav Bulatov的建议似乎不包括SSE4.2支持,添加<code>--copt=-msse4.2</code>就足够了。最后,我成功地用</p>
<pre><code>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
</code></pre>
<p>没有任何警告或错误。</p>
<p>任何系统的最佳选择可能是:</p>
<pre><code>bazel build -c opt --copt=-march=native --copt=-mfpmath=both --config=cuda -k //tensorflow/tools/pip_package:build_pip_package
</code></pre>
<p>(<strong>更新:<a href="https://stackoverflow.com/questions/41293077/how-to-compile-tensorflow-with-sse4-2-and-avx-instructions#comment81255824_47146118">the build scripts may be eating ^{<cd2>}</a>,可能是因为它包含一个<code>=</code></strong>)</p>
<p><code>-mfpmath=both</code>只适用于gcc,不适用于clang。<code>-mfpmath=sse</code>可能同样好,如果不是更好的话,也是x86-64的默认值。32位构建默认值为<code>-mfpmath=387</code>,因此更改该值将有助于32位。(但是,如果您想要高性能的数字处理,您应该构建64位二进制文件。)</p>
<p>我不确定TensorFlow对于<code>-O2</code>或<code>-O3</code>的默认值是什么。<code>gcc -O3</code>支持完全优化,包括自动矢量化,但有时会使代码变慢。</p>
<hr/>
<>这是什么:<a href="https://docs.bazel.build/versions/master/bazel-user-manual.html" rel="noreferrer">^{<cd10>} for ^{<cd11>}</a>直接将一个选项传递给GCC来编译C和C++文件(但不链接,因此需要跨文件链接时间优化的不同选项)</p>
<p>x86-64 gcc默认只使用SSE2或更早的SIMD指令,因此可以在<em>any</em>x86-64系统上运行二进制文件。(见<a href="https://gcc.gnu.org/onlinedocs/gcc/x86-Options.html" rel="noreferrer">https://gcc.gnu.org/onlinedocs/gcc/x86-Options.html</a>)。那不是你想要的。您希望生成一个二进制文件,它可以利用您的CPU可以运行的所有指令,因为您只在构建它的系统上运行这个二进制文件。</p>
<p><code>-march=native</code>启用您的CPU支持的所有选项,因此它使<code>-mavx512f -mavx2 -mavx -mfma -msse4.2</code>冗余。(而且,<code>-mavx2</code>已经启用了<code>-mavx</code>和<code>-msse4.2</code>,因此Yaroslav的命令应该是正确的)。另外,如果您使用的CPU不支持这些选项之一(如FMA),那么使用<code>-mfma</code>将生成一个二进制文件,该二进制文件会因非法指令而出错。</p>
<p><a href="https://www.tensorflow.org/versions/r1.2/install/install_sources" rel="noreferrer">TensorFlow's ^{<cd18>} defaults to enabling ^{<cd2>}</a>,因此使用它应该避免手动指定编译器选项。</p>
<p><code>-march=native</code>启用<code>-mtune=native</code>,因此<a href="https://stackoverflow.com/questions/44490331/how-does-mtune-actually-work">it optimizes for your CPU</a>对于诸如哪一个AVX指令序列最适合未对齐的加载之类的事情。</p>
<p>所有这些都适用于gcc、clang或ICC。(对于ICC,可以使用<code>-xHOST</code>,而不是<code>-march=native</code>。)</p>