Обновление gcc до 8/9 вызывает «Ошибку: неподдерживаемая инструкция ‘vmovdqu'», в то время как gcc-7 работает нормально

#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, но не содержит никакого ассемблерного кода.

Это первый раз, когда я вижу ошибку «Сообщение ассемблера». Поэтому я прошу помощи в понимании того, что это значит. Мой вопрос:

  1. Когда ассемблер будет жаловаться на неподдерживаемую инструкцию? Я уже видел неподдерживаемую инструкцию во время выполнения, но не это «сообщение ассемблера». Поскольку это происходит после обновления GCC, я предполагаю, что это новая функция нового компилятора / ассемблера? Я не могу найти ни одного документа, поэтому, если кто-нибудь может указать мне какой-либо документ, объясняющий это, это было бы очень ценно.
  2. Добавление «-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 не использовал.

Надеюсь, это поможет кому-то, кто также сталкивается с подобными проблемами.