Как я могу использовать встроенные функции AES-NI на Mac?
Я пытаюсь скомпилировать приложение C на Mac. Я использую SSE4 и AES-NI.
В Linux я просто вызываю gcc с флагами -msse4 и -maes и включаю заголовок wmmintrin.h, и я могу назвать встроенные функции SSE, такие как _mm_add_epi64(a,b)
или AES-NI, такие как _mm_aesenc_si128(a, b)
и все работает отлично.
На Mac сложнее, потому что Apple заменяет GCC на llvm-gcc, который еще не поддерживает AES-NI. Так что встроенные функции SSE4 работают нормально, но не AES. Даже встроенные вызовы инструкции AES не распознаются.
Intel имеет много примеров кода AES на своем веб-сайте, но это только для Linux и Windows.
Я заметил, что инструкция RDRAND также не поддерживается llvm-gcc, но Intel предлагает обходной путь для этого, используя макрос C, который расширяется до необработанного машинного байтового кода. ( См. Файл примера rdrand.h в этой библиотеке Intel)
К сожалению, подобного обходного пути для инструкций AES-NI не существует, вероятно, потому что инструкции имеют аргументы и не могут быть оценены как байты статического машинного кода.
Существуют программы, которые используют AES-NI на Mac, включая собственное хранилище файлов Apple, поэтому должен быть какой-то метод, который работает!
Чтобы конкретизировать мой вопрос, как получить следующий простой вызов для компиляции с использованием последней версии Mac gcc-llvm 4.2 (последняя публичная версия в Mountain Lion xcode 4.4.1):
__m128i A, B, C;
/* A, B, C initialized here... */
A = _mm_aesenc_si128(B, C);
Спасибо за любую помощь!
1 ответ
Служба поддержки Apple сообщила, что это невозможно с помощью Xcode. (И на самом деле их ответ был немного странным и подразумевал, что AES-NI не был тем, что разработчик когда-либо нуждался в непосредственном использовании, поэтому я не должен беспокоиться. Вздох, спасибо, Apple.)
Однако я нашел два рабочих решения, оба просто избегая программного обеспечения Apple. Одним из них является использование собственного коммерческого компилятора C++ от Intel. Другой способ - загрузить и скомпилировать GCC 4.6 или 4.7 из исходного кода и использовать его напрямую. Это вариант, который я выбрал. Я следовал этому руководству. Компиляция и установка GCC (хотя и чистая) по-прежнему остается хлопотным и обходным решением, если использовать только один встроенный процессор, но он работает. Спасибо, команда GCC!