【问题标题】:Compile errors with Assembler messages使用汇编器消息编译错误
【发布时间】:2013-06-12 04:07:12
【问题描述】:

我正在使用点云库。它主要是在 C++ 中,当我编译它时,会出现这样的错误:

[  0%] Building CXX object common/CMakeFiles/pcl_common.dir/src/intersections.cpp.o
In file included from /home/lv/pcl-trunk/common/include/pcl/point_types.h:301:0,
                 from /home/lv/pcl-trunk/common/include/pcl/common/impl/common.hpp:41,
                 from /home/lv/pcl-trunk/common/include/pcl/common/common.h:186,
                 from /home/lv/pcl-trunk/common/include/pcl/common/intersections.h:41,
                 from /home/lv/pcl-trunk/common/src/intersections.cpp:38:
/home/lv/pcl-trunk/common/include/pcl/impl/point_types.hpp:1009:68: warning: ‘SHOT’ is deprecated [-Wdeprecated-declarations]
/tmp/ccRLy4Re.s: Assembler messages:
/tmp/ccRLy4Re.s:2488: Error: no such instruction: `vfmadd312ss (%r9),%xmm2,%xmm1'
/tmp/ccRLy4Re.s:2638: Error: no such instruction: `vfmadd312ss (%rdx),%xmm2,%xmm1'
/tmp/ccRLy4Re.s:3039: Error: no such instruction: `vfmadd312ss (%rax,%r11,4),%xmm5,%xmm1'
/tmp/ccRLy4Re.s:3402: Error: no such instruction: `vfmadd312ss (%rax,%r11,4),%xmm5,%xmm1'
/tmp/ccRLy4Re.s:3534: Error: no such instruction: `vfmadd312ss (%rax,%rdx,4),%xmm1,%xmm2'
/tmp/ccRLy4Re.s:3628: Error: no such instruction: `vfmadd312ss (%rax,%rdx,4),%xmm1,%xmm2'
/tmp/ccRLy4Re.s:6103: Error: no such instruction: `vfmadd312ss (%r11),%xmm0,%xmm4'
/tmp/ccRLy4Re.s:6121: Error: no such instruction: `vfmadd312ss (%r11,%rbx,4),%xmm0,%xmm3'
/tmp/ccRLy4Re.s:6131: Error: no such instruction: `vfmadd312ss (%r11,%rbp,4),%xmm0,%xmm2'
/tmp/ccRLy4Re.s:6135: Error: no such instruction: `vfmadd312ss (%r11,%r13,4),%xmm0,%xmm1'
/tmp/ccRLy4Re.s:6344: Error: no such instruction: `vfmadd312ss (%r10),%xmm0,%xmm1'
/tmp/ccRLy4Re.s:11760: Error: no such instruction: `vfnmadd312ss (%rdx),%xmm0,%xmm0'
/tmp/ccRLy4Re.s:13976: Error: no such instruction: `vfmadd312ss (%rdi),%xmm0,%xmm1'
/tmp/ccRLy4Re.s:14125: Error: no such instruction: `vfmadd312ss (%rdx),%xmm0,%xmm1'
make[2]: *** [common/CMakeFiles/pcl_common.dir/src/intersections.cpp.o] Error 1
make[1]: *** [common/CMakeFiles/pcl_common.dir/all] Error 2
make: *** [all] Error 2

谁能告诉我如何阅读这些错误并给我一些解决建议?

【问题讨论】:

    标签: c++ assembly point-cloud-library


    【解决方案1】:

    您可以使用以下命令查看您的 CPU(用于编译器): gcc -march=native -Q --help=target | grep march

    然后您可以在 ccmake CMAKE_CXX_FLAGS 选项中添加您的 cpu 类型,对我来说: CMAKE_CXX_FLAGS = -march=corei7-avx

    【讨论】:

    • 这有什么帮助?问题是汇编器太老了,无法汇编 gcc 发出的指令。如果您的 CPU 支持 FMA,gcc -march=nativegcc -march=haswell 将发出 FMA 指令。使用不使用 FMA 指令(或 -mno-fma)的较低 -march 设置会降低运行时性能,但这甚至不是这个答案所暗示的。
    【解决方案2】:

    您可以添加-march=native -mno-avx 这对我有用。

    在我的 CMakeLists.txt 中,我将以上内容添加到 CMAKE_CXX_FLAGS 中:

    SET(CMAKE_CXX_FLAGS "-ggdb -O3 -fPIC -std=c++0x -march=native -mno-avx")
    

    [Source can be found in this page.]

    【讨论】:

    • 这是在核心 i7 处理器上通过 ubuntu 12.04.05 i386 成功编译 rgbdslam w ROS 的解决方案。
    • 如果您想制作一个较慢的可执行文件来解决旧的汇编程序,您应该首先尝试-mno-fma 和/或-mno-avx2 来禁用 FMA 指令但启用 AVX。
    【解决方案3】:

    我在尝试安装 glove 时遇到了这个问题。

    通过升级安装在我的 ubuntu 14.04 机器上的 g++ 版本解决了我遇到的问题。

    我原来的g++版本是4.6.4,我升级到g++-5(升级时是5.4.1)。

    【讨论】:

      【解决方案4】:

      有来自汇编器的错误信息,这意味着汇编器不知道这些汇编代码,例如vfmadd312ss

      当编译器生成一些仅 CPU 的汇编代码时会发生这种情况,例如 intel E5 with arch core-avx2 有额外的指令集 advanced vector extensions,但如果“as”是旧工具以了解新 CPU,则会发生此错误。

      试试新版本的 Binutils,现在最新的是2.29

      如果您从其他工具编译代码,例如bazel,请确保它将调用新的“as”。

      【讨论】:

      • 这是唯一好的答案:升级您的汇编器以理解 AVX2 / FMA 指令,这样您就可以创建一个可执行文件,利用您的 CPU 可以做的所有事情。 (最好也使用最新的编译器版本,它是在您的硬件之后发布的,因此它可能知道如何对其进行调整。例如,gcc6.4 是当今不错的选择,或者如果您感觉可以使用最新的 gcc7.x 版本冒险。)
      • 也值得一试 clang,它有自己的内置汇编器,因此不依赖于 binutils。在许多情况下,它比 gcc 编写的代码更好,尤其是在数字运算方面。 (默认情况下它会展开微小的循环。)
      【解决方案5】:

      您是否尝试过使用不同的编译器?

      我在使用点云库的项目中遇到了汇编错误。这可能是由于在核心 i7 处理器上使用了 Ubuntu 12.04(请参阅 https://github.com/uzh-rpg/rpg_svo/issues/7)。

      我能够通过安装“clang”编译器进行编译

      sudo apt-get install clang
      

      然后运行 ​​cmake:

      cmake -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ .
      

      【讨论】:

      • 这是一个很好的建议:clang 有它自己的内置汇编器,有时可以比 gcc 更快地编写代码。特别是新版本的 clang 应该比旧的 gcc 更好,特别是如果您的 gcc 安装因无法使用 FMA 指令而受到限制。
      【解决方案6】:

      我遇到了同样的错误信息, 我从我的 makefile 中的 CXXFLAGSCFLAGS 中删除了 -march=native, 它适用于我的情况。但是由于您没有发布您的 makefile,我不确定这是否适用于您的情况,您可以尝试任何方式。

      【讨论】:

      • 如果你想制作一个不使用 FMA 指令的较慢的二进制文件,这很有效。这是最糟糕的解决方案,比升级您的汇编程序或使用 -mno-fma 仅禁用 FMA 而不删除 -march=native 的 AVX 和 -mtune=native 效果更糟糕。
      • @PeterCordes 嗨,感谢您的建议,但是如何升级汇编程序?我在 Linux 服务器(Redhat)上。就我而言,我的错误消息显示为“没有这样的指令:'shlx %edi, %edx,%edx'”,您认为对我的情况最好的解决方案是什么?提前致谢!
      • 安装新的 binutils 以匹配发出 BMI2 指令的新编译器,或在不同的机器上交叉编译二进制文件。或者只是忍受你的软件运行速度比它可能慢。或者如果您不想接触现有的 gcc + binutils 安装,请安装 clang:clang 有一个内置的汇编器并且不使用 /usr/bin/as
      【解决方案7】:

      您可能需要在编译时启用高级矢量扩展(并使用支持此功能的工具链)。试试 -march=core-avx2 或类似的东西。

      如果您自己编译库,则可能需要将其配置为不使用 AVX。

      【讨论】:

      • 对不起,我不是一个有经验的程序员。我不太明白你的想法。你能再解释一下吗?
      • 我不知道这是如何构建的,但尝试让编译器/汇编器使用 -march=core-avx2。您需要在配置时传递开关 (CPPFLAGS="-march=core-avx2) 或只需编辑您的构建脚本并添加它。
      • 不,问题是汇编器太旧,无法支持编译器发出的 FMA 指令。 -march 唯一能做的就是禁用新指令并制作更慢的二进制文件。
      猜你喜欢
      • 2012-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-17
      • 1970-01-01
      相关资源
      最近更新 更多