如何使用SSE4.2和AVX指令编译Tensorflow?

如何使用SSE4.2和AVX指令编译Tensorflow?,第1张

如何使用SSE4.2和AVX指令编译Tensorflow?

我只是遇到了同样的问题,似乎

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位二进制文​​件。)

我不知道为了什么TensorFlow的默认-O2或者-O3是。 gcc -O3可以进行包括自动矢量化在内的全面优化,但这有时会使代码变慢。

这里做的事情:

--copt
用于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
默认设置为
enabled-march=native
,因此使用它应该避免需要手动指定编译器选项。

-march=nativeenable -mtune=native,因此它针对您的CPU进行了优化,例如哪种AVX指令序列最适合未对齐的负载。

所有这些都适用于gcc,clang或ICC。(对于ICC,您可以使用

-xHOST
代替
-march=native
。)



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5630203.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-15

发表评论

登录后才能评论

评论列表(0条)

保存