Сбой при вызове _mm_loadu_si128() с включенными встроенными функциями AESNI

Мы компилируем 32-битное приложение, которое связывается со статической сборкой cryptopp.

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

Наша программа компилируется и отлично работает на этой машине. Когда мы пытаемся бежать дальше

ЦП: 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) 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