Неуспех при повикване към _mm_loadu_si128() с активирани вътрешни AESNI

Компилираме 32-битово приложение, което се свързва със статична компилация на cryptopp.

gcc: 4.4.7
CPU: Intel Xeon E5-2680
ОС: CentoOS 6.5
Crypto++ : 5.6.2

Нашата програма се компилира и работи добре на тази машина. Когато се опитваме да бягаме

CPU: Intel Xeon X5690
ОС: CentoOS 6.5
gcc: 4.4.6

Получаваме грешка при сегментиране в cryptopp -> rijndael.cpp -> Rijndael::Base::UncheckedSetKey() извикване на _mm_loadu_si128()

Ако изградим cryptopp с CRYPTOPP_BOOL_AESNI_INTRINSICS_AVAILABLE, зададен на 0, всичко работи добре. Изглежда, че AES-NI трябва да е наличен на този сървър и извикването на cryptopp към HasAESNI() връща true.

Някакви идеи какво може да причинява това или как да проследим по-нататък?


person PhilC    schedule 28.02.2014    source източник
comment
_mm_loadu_si128 е MOVDQU. Вярвам, че това е инструкция SSE2. Компилирахте ли Crypto++ и вашата програма на машината Intel Xeon X5690 (или я копирахте от друга машина)? Микрокодът актуален ли е на Intel Xeon X5690 (вярвам, че инструкцията се емулира с микрокод)?   -  person jww    schedule 25.03.2014
comment
Ако компилираме на X5690, той работи на тази машина добре. Получаваме грешката при компилиране на E5-2680 и копиране в X5690. Ще разгледам микрокода, не съм много запознат с това.   -  person PhilC    schedule 25.03.2014


Отговори (2)


Получаваме грешката при компилиране на E5-2680 и копиране в X5690.

О, това е интересно. Опитайте да добавите -mtune=pentium4 към CXXFLAGS. Intel Xeon E5-2680 има набор от инструкции AVX; докато Intel Xeon X5690 има само SSE 4.2. Crypto++ използва инструкциите за двойно умножение с четири думи (PCLMULQDQ) и AES-NI от набора инструкции AVX (който липсва на другия процесор).

Ако -mtune=pentium4 не работи, тогава ще трябва да деактивирате чрез CRYPTOPP_BOOL_AESNI_INTRINSICS_AVAILABLE. Сега като се замисля, това е, което вероятно ще трябва да направите, тъй като това е избор на функция по време на компилиране, а не избор на функция по време на изпълнение.

person jww    schedule 25.03.2014
comment
трябваше просто да се придържаме към CRYPTOPP_BOOL_AESNI_INTRINSICS_AVAILABLE. Благодаря за подробното обяснение. - person PhilC; 25.03.2014

„Intel(R) Xeon(R) CPU E5606 @ 2.13GH“ също не поддържа инструкцията „AESNI“. Компилирах Crypto++ на "Intel Xeon E312xx (Sandy Bridge)" и получавам същата грешка на "E5606"! Деактивирайте „AESNI“ във файла CMakeLists.txt, включете опцията „DISABLE_AESNI“. option(DISABLE_AESNI "Disable AES-NI" ON)

person cranehuang    schedule 01.04.2017