【问题标题】:illegal instruction error when building Tensorflow from source从源代码构建 TensorFlow 时出现非法指令错误
【发布时间】:2018-02-03 06:05:14
【问题描述】:

我正在使用 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

接受的答案here 和安装文档中的注释“将--cxxopt="-D_GLIBCXX_USE_CXX11_ABI=0" 添加到 gcc 5 及更高版本的构建命令”的组合。

但是,import tensorflow as tf 会导致错误

illegal instruction (core dumped), exiting python.

我也试过了:conda update libgcc 没用。

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

【问题讨论】:

  • 可能是一个愚蠢的问题,但请确定:您的 CPU 支持您指定的所有构建标志,对吧?
  • 我没有仔细检查这些标志 - 但认为如果它们不受支持,它将无法编译。
  • 不,它会很好地编译并为不同的处理器生成二进制文件。在您的 bash gcc -march=native -Q --help=target | grep enabled 中运行并仔细检查您指定的所有标志实际上是否在列表中(尤其是 -mavx2 和 -mfma)
  • 糟糕,我忘记了 -mfpmath 没有显示为启用或禁用。查看 gcc 命令的完整输出,了解您可以指定的可能值(尽管 both 应该没问题)
  • @GPhilo 看起来我应该更仔细地检查一下!

标签: python gcc tensorflow


【解决方案1】:

错误消息告诉我你的程序是用你的处理器没有的指令编译的,看看你的构建字符串让我怀疑 -mavx2-mfma AFAIK 仅在最近(和高-结束)CPU。 请注意,gcc 可以很好地编译你的 CPU 不支持的指令的标志,但程序不会在你的机器上运行

为确保您的 CPU 支持这些标志,请在 bash gcc -march=native -Q --help=target | grep enabled 中运行并检查输出是否包含您要使用的所有构建标志(-mfpmath 除外,它不会显示为启用或禁用,因为它允许输出列表。为此,您需要检查完整的gcc -march=... 命令输出)。

要回答您的最终评论,没有办法“启用”这些指令,它们是在硬件中实现的,它们要么在您的 CPU 上可用,要么不可用。

【讨论】:

  • noobish 问题 - 是否可以在关闭这些功能的情况下编译 tensorflow,以便在旧 CPU 上进行开发?
  • 当然!在configure 脚本中,有一个阶段询问您要传递哪些编译器优化标志,并指定native 是默认值。只需将其替换为空字符串即可。否则,我认为不将 -c=opt 选项添加到您的 Bazel 构建命令也应该是等效的(因为当您将该标志添加到构建命令时应用了这些编译器标志)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多