Подтвердить что ты не робот

Как использовать 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 должен.

4b9b3361

Ответ 1

Более простое решение, которое фиксировало эту проблему для меня, заключалось в добавлении -Wa,-q к флагам компилятора. Из man-страниц для as (версия 1.38):

-q

    Используйте встроенный ассемблер clang (1) вместо системного ассемблера на основе GNU.

Часть -Wa передает его из драйвера компилятора на ассемблер, так же как -Wl передает аргументы компоновщику.

Ответ 2

Ассемблер GNU (GAS) не поддерживается в Mac OS X.

Чтобы использовать AVX, мне пришлось:

Странно то, что, хотя ассемблер 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.