Как использовать AVX/pclmulqdq в Mac OS X
Я пытаюсь скомпилировать программу, которая использует инструкцию pclmulqdq, присутствующую в новых процессорах Intel. Я установил GCC 4.6 с использованием macports, но когда я скомпилирую свою программу (которая использует встроенный _mm_clmulepi64_si128), я получаю
/var/folders/ps/sfjmtgx5771_qbqnh4c9xclr0000gn/T//ccEAWWhd.s:16:no such
instruction: `pclmulqdq $0, %xmm0,%xmm1'
Кажется, что GCC может генерировать правильный код сборки из instrinsic, но ассемблер не распознает инструкцию.
Я установил binutils, используя macports, но проблема не устранена. Как узнать, какой ассемблер gcc использует? Ассемблер XCode, вероятно, не поддерживает его, но сборщик binutils должен.
Ответы
Ответ 1
Более простое решение, которое фиксировало эту проблему для меня, заключалось в добавлении -Wa,-q
к флагам компилятора. Из man-страниц для as
(версия 1.38):
-q
Используйте встроенный ассемблер clang (1) вместо системного ассемблера на основе GNU.
Часть -Wa
передает его из драйвера компилятора на ассемблер, так же как -Wl
передает аргументы компоновщику.
Ответ 2
Ассемблер GNU (GAS) не поддерживается в Mac OS X.
Чтобы использовать AVX, мне пришлось:
- Установить GCC с помощью MacPorts;
- заменить собственный ассемблер OS X (/usr/bin/as) на script, который вызывает ассемблер clang.
- Скомпилируйте программу с установленным GCC (например, gcc-mp-4.7)
Странно то, что, хотя ассемблер clang поддерживает AVX, компилятор clang не распознает инсталляторы AVX, вызывая уродливое обходное решение выше.
Ответ 3
Встроенная версия как устарела. (В OS X 10.8.3)
/usr/libexec/as/x86_64/as -v
Версия Apple Inc cctools-839, сборщик GNU версии 1.38
Кажется, не существует версии газа для OS X. (См.
Установка ассемблера GNU в OSX)
Использование ассемблера clang с помощью взлома script (как указано в Conrado PLG) является одним из способов обхода. Тем не менее, он требует прав администратора и перезаписывает исполняемые файлы, связанные с OS X, что создает риск его перезаписывания новой (но, возможно, устаревшей) версией в комплекте с будущей версией OS X.
Есть ли лучшее обходное решение?
Как отмечено в Почему перекрестный gcc вызывает native 'as??, кажется, что можно указать, какие "as" -executable и flags использовать (используя "-specs =..." ). Облегчение обхода проблемы заключается в том, чтобы передать правильные флаги "-специалистов" для вызова ассемблера clang. Это не требует прав администратора и не может быть нарушено обновлением OS X. Точные подробности о том, как выполнить это, еще предстоит выяснить (кто?).
Если это обходное решение становится безотказным и достаточно прозрачным, может потребоваться использовать эти настройки как по умолчанию (или, по крайней мере, вариант) для macport gcc (чтобы он поддерживал "-march = native" и т.п.), Существует такая настройка configure.args( "--with-as = ${prefix}/bin/as", как показано в https://trac.macports.org/browser/trunk/dports/lang/gcc48/Portfile), который можно было бы заменить.
Ответ 4
Похоже, что я исправил свою проблему, используя синтаксис gcc/asm, где asm {} передается строка, состоящая из операторов ассемблера, окруженных кавычками и разделенных обратным слэшем и символом обратной линии, или обратной косой чертой, содержащей другую инструкцию ассемблера.
https://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html#s3
Ответ 5
Просто используйте
as --version
AVX появился вокруг версии 2.18.50 в газе/binutils.