#c #gcc
#c #gcc
Вопрос:
Я компилирую Apache Arrow (https://arrow.apache.org /) с CMake 3.15 и gcc / g -7 (7.5.0), и все идет хорошо. Однако, когда я обновляю gcc / g до 8 (8.4.0) и 9 (9.3.0) с той же версией CMake, я получил следующие ошибки:
/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, но не содержит никакого ассемблерного кода.
Это первый раз, когда я вижу ошибку «Сообщение ассемблера». Поэтому я прошу помощи в понимании того, что это значит. Мой вопрос:
- Когда ассемблер будет жаловаться на неподдерживаемую инструкцию? Я уже видел неподдерживаемую инструкцию во время выполнения, но не это «сообщение ассемблера». Поскольку это происходит после обновления GCC, я предполагаю, что это новая функция нового компилятора / ассемблера? Я не могу найти ни одного документа, поэтому, если кто-нибудь может указать мне какой-либо документ, объясняющий это, это было бы очень ценно.
- Добавление «-mavx» в
target_compile_options
не решает проблему. У кого-нибудь есть предложения по решению проблемы?
Спасибо!
Комментарии:
1. Это не упоминается, но вы удалили сгенерированные файлы cmake и запустили cmake с нуля?
2. Да, я удаляю папку сборки и запускаю CMake с нуля для обеих сред GCC8 / 9.
3. Как насчет обновления binutils?
4. Binutills’ы, которые я использую с gcc 9, являются последней версией, поставляемой с Ubuntu 20.04, версия 2.34. У него есть эта проблема
Ответ №1:
TLDR: я нашел решение добавить «-mavx512bw» в target_compile_options
Пожалуйста, продолжайте чтение, если хотите услышать более подробную информацию о основной причине и о том, как я ее нашел.
Немного погуглив, я обнаружил, что на этой веб-странице говорится об ошибке GNU AS. 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 не использовал.
Надеюсь, это поможет кому-то, кто также сталкивается с подобными проблемами.