从源代码构建Tensorflow时出现非法指令错误

4
我正在使用bazel从源代码构建tensorflow,具体步骤在这里描述:https://www.tensorflow.org/install/install_sources 按照安装文档的说明,我成功地进行了以下编译:
bazel build -c opt --copt=-mavx --copt=-mavx2 --copt=-mfma --copt=-mfpmath=both \
--cxxopt="-D_GLIBCXX_USE_CXX11_ABI=0"--config=cuda \
-k //tensorflow/tools/pip_package:build_pip_package

这是一个结合了这里所接受的答案和安装文档中的一条注意事项的建议,对于gcc 5及以上版本,请在构建命令中添加--cxxopt="-D_GLIBCXX_USE_CXX11_ABI=0"
然而,import tensorflow as tf会导致错误。
illegal instruction (core dumped), exiting python.

我还尝试过:conda update libgcc,但没有成功。

如何使用gcc 5.0从源代码构建tensorflow?


不会,它可以编译成功并生成适用于不同处理器的二进制文件。在bash中运行gcc -march=native -Q --help=target | grep enabled,并仔细检查您指定的所有标志是否实际上都在列表中(特别是-mavx2和-mfma)。 - GPhilo
哎呀,我忘记了-mfpmath不会显示为已启用或已禁用。请查看gcc命令的完整输出以获取您可以指定的可能值(尽管“both”应该没问题)。 - GPhilo
1
@GPhilo 看起来我应该更仔细地检查! - anon01
@anon01,你使用的是哪种Linux架构? - Susan
我的意思是,这个问题是五年前的了。说实话,我不记得当时问过它 :) - anon01
显示剩余19条评论
1个回答

7
错误信息告诉我你的程序编译时使用了处理器不支持的指令。查看您的构建字符串,我怀疑是 -mavx2-mfma,这些指令只在最近(和高端)的 CPU 上实现。 请注意,gcc 可以正常编译使用不支持的指令标志,但程序将无法在您的计算机上运行。 为确保您的 CPU 支持这些标志,请在 bash 中运行 gcc -march=native -Q --help=target | grep enabled 并检查输出是否包含您要使用的所有构建标志(除了 -mfpmath,因为它允许一个输出列表,因此不会显示为已启用或已禁用。您需要检查完整的 gcc -march=... 命令输出)。
回答您的最后一条评论,没有办法“启用”这些指令,它们是硬件实现的,要么您的 CPU 支持,要么不支持。

菜鸟问题 - 是否可能关闭这些功能编译TensorFlow,以便在旧型CPU上开发? - quester
1
当然可以!在 configure 脚本中,有一个阶段会询问您要传递哪些编译器优化标志,指定本地为默认值。只需将其替换为空字符串即可。否则,我认为在 Bazel 构建命令中不添加 -c=opt 选项也应该是等效的(因为当您将该标志添加到构建命令时,这些编译器标志会被应用)。 - GPhilo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接