Успешная компиляция инструкции SSE с qmake (но SSE2 не распознается)

Я пытаюсь скомпилировать и запустить мой код, перенесенный из Unix в Windows. Мой код является чистым С++ и не использует классы Qt. это нормально в Unix.

Я также использую Qt creator как IDE и qmake.exe с -spec win32-g++ для компиляции. Поскольку в моем коде есть инструкции sse, я должен включить заголовок emmintrin.h.

Я добавил:

QMAKE_FLAGS_RELEASE += -O3 -msse4.1 -mssse3 -msse3 -msse2 -msse

QMAKE_CXXFLAGS_RELEASE += -O3 -msse4.1 -mssse3 -msse3 -msse2 -msse

В файле .pro. Я смог скомпилировать свой код без ошибок. но после запуска он дает ошибку во время выполнения при выполнении некоторых функций, содержащих __m128 или тому подобное.

Когда я открываю emmintrin.h, я вижу:

#ifndef __SSE2__
# error "SSE2 instruction set not enabled"
#else

и undefined после #else.

Я не знаю, как включить sse на моем компьютере.

Платформа: Windows Vista​​p >

Тип системы: 64-разрядный

Процессор: Intel (R) Core (TM) i5-2430M CPU @2.40Hz

Кто-нибудь знает решение?

Спасибо заранее.

Ответы

Ответ 1

Похоже, что ваши данные не выровнены по 16 байт, что является требованием для SSE-нагрузок, таких как mm_load_ps. Вы можете:

  • используйте _mm_loadu_ps как временное обходное решение. На более новых процессорах производительность для смещенных нагрузок, таких как это довольно мало (на более старых процессорах она намного более значительна), но по возможности ее следует избегать

или

  • исправьте выравнивание памяти. В Windows/Visual Studio вы можете использовать атрибут declspec(align(16)) для статических распределений или _aligned_malloc для динамических распределений. Для gcc и большинства других цивилизованных платформ/компиляторов используйте __attribute__ ((align(16))) для первого и posix_memalign для последнего.