Как использовать AVX / pclmulqdq в Mac OS X - PullRequest
23 голосов
/ 23 марта 2012

Я пытаюсь скомпилировать программу, которая использует инструкцию 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 может генерировать правильный код сборки из встроенной,ассемблер не распознает инструкцию.

Я установил binutils, используя macports, но проблема сохраняется.Как мне узнать, какой ассемблер использует gcc?Ассемблер XCode, вероятно, не поддерживает его, но ассемблер binutils должен.

Ответы [ 5 ]

24 голосов
/ 13 октября 2013

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

-q

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

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

13 голосов
/ 14 апреля 2012

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

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

  • Установить GCC с помощью MacPorts;
  • Заменить собственный ассемблер OS X (/ usr / bin / as) на скрипт, который вызывает ассемблер clang.
  • Скомпилировать программу с установленным GCC (например, gcc-mp)-4.7)

Странно то, что, хотя ассемблер clang поддерживает AVX, компилятор clang не распознает примитивы AVX, что вынуждает уродливый обходной путь выше.

4 голосов
/ 13 мая 2013

Встроенная версия as устарела.(В OS X 10.8.3)

/ usr / libexec / as / x86_64 / as -v

версия Apple Inc cctools-839, версия ассемблера GNU 1.38

Кажется, что не существует версии газа для OS X. (См .: Установка GNU Assembler в OSX )

Использование ассемблера clang через взлом скрипта (как указано вКонрадо PLG) является одним из обходных путей.Тем не менее, он требует прав администратора и перезаписывает исполняемые файлы, связанные с OS X, что создает риск его перезаписи новой (хотя, возможно, устаревшей) версией, связанной с будущей версией OS X.

Есть литогда лучший обходной путь?

Как отмечалось в Почему кросс-gcc вызывает native 'as'? представляется возможным указать, какой "as" -executable и использовать флаги (using "-specs = ... ").Кажется, что более простой обход проблемы состоит в передаче правильных флагов "-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), который можно заменить.

1 голос
/ 19 ноября 2015

Похоже, что я исправил свою проблему, используя синтаксис gcc / asm, где функции asm {} передается строка, состоящая из операторов ассемблера, заключенная в кавычки и разделенная обратной косой чертой и новой строкой или обратной косой чертой и строкой в ​​кавычках, содержащей другой оператор ассемблера.

https://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html#s3

0 голосов
/ 23 марта 2012

Просто используйте

as --version

AVX появился около версии 2.18.50 в газе / binutils.

...