我用https://arrow.apache.org/ 3.15和gcc/g++-7 (7.5.0)编译了Apache (https://arrow.apache.org/),运行良好。但是,当我用相同的CMake版本将gcc/g++升级到8(8.4.0)和9(9.3.0)时,我得到了以下错误:
/tmp/ccrlCxYO.s: Assembler messages:
/tmp/ccrlCxYO.s:5651: Error: unsupported instruction `vmovdqu'
make[2]: *** [src/parquet/CMakeFiles/parquet_objlib.dir/build.make:194: src/parquet/CMakeFiles/parquet_objlib.dir/encoding.cc.o] Error 1目标文件(encoding.cc)是一个纯C++文件。它使用Intel Intrinsics,但不包含任何组装代码。
这是我第一次看到“汇编程序消息”错误。所以我请求你帮助我理解这意味着什么。我的问题是:
。
target_compile_options中添加"-mavx“并不能解决这个问题。有人有解决这个问题的建议吗?谢谢!
发布于 2021-01-14 05:11:52
TLDR:我发现解决方案是在target_compile_options中添加"-mavx512bw“
如果你想了解更多关于根源的细节,以及我是如何发现的,请继续阅读。
在搜索了一下之后,我发现这个网页谈论的是GNU的一个bug。https://www.mail-archive.com/bug-binutils@gnu.org/msg30524.html
该网页报告说,AS不承认"vmovdqu16",这需要AVX512VL+AVX512BW的支持。但是,汇编程序会报告一条错误消息,表示不支持"vmovdqu“。
这提醒我,我可能会遇到同样的问题。AS实际上收到"vmovdqu8/16/32“,但它报告"vmovdqu”。此错误消息非常具有误导性,因为"vmovdqu“和"vmovdqu16”需要不同的指令集支持。前者只需要AVX,而后者则需要AVX512BW+AVX512VL。
我决定尝试将-mavx512bw添加到编译选项中(我以前已经有avx512vl了)。它实际上解决了问题。
所以,我认为整个故事是: GCC的新版本使用了一些新的SIMD指令,而旧GCC并没有使用。
希望这能帮助那些遇到类似问题的人。
https://stackoverflow.com/questions/65712210
复制相似问题