Как проверить, поддерживает ли ваша Linux поддержка SSE2

На самом деле у меня есть 2 вопроса:

  • Совместимость SSE2 с проблемой CPU или компилятором?
  • Как проверить, поддерживает ли ваш процессор или компилятор SSE2?

Я использую версию GCC:

gcc (GCC) 4.5.1

Когда я попытался скомпилировать код, он дал мне эту ошибку:

$ gcc -O3 -msse2 -fno-strict-aliasing -DHAVE_SSE2=1 -DMEXP=19937 -o test-sse2-M19937 test.c
cc1: error: unrecognized command line option "-msse2"

И cpuinfo показал это:

processor  : 0
vendor     : GenuineIntel
arch       : IA-64
family     : 32
model      : 1
model name : Dual-Core Intel(R) Itanium(R) Processor 9140M
revision   : 1
archrev    : 0
features   : branchlong, 16-byte atomic ops
cpu number : 0
cpu regs   : 4
cpu MHz    : 1669.000503
itc MHz    : 416.875000
BogoMIPS   : 3325.95
siblings   : 2
physical id: 0
core id    : 0
thread id  : 0

Ответ 1

  • Это и то, и другое. Компилятор/ассемблер должен иметь возможность генерировать/обрабатывать инструкции SSE2, а затем процессор должен их поддерживать. Если ваш двоичный файл содержит инструкции SSE2 без каких-либо условий, и вы пытаетесь запустить его на Pentium II, вам не повезло.

  • Лучший способ - проверить свое руководство GCC. Например, моя справочная страница GCC ссылается на параметр -msse2, который позволит вам явно включать инструкции SSE2 в двоичные файлы. Любой относительно недавний GCC или ICC должен поддерживать его. Что касается вашего процессора, проверьте строку флажков в /proc/cpuinfo.

Было бы лучше, если бы у вас были проверки в вашем коде с использованием cpuid и т.д., так что секции SSE2 могут быть отключены в CPU, которые его не поддерживают, и ваш код может вернуться к более распространенному набору инструкций.

EDIT:

Обратите внимание, что ваш компилятор должен быть либо родным компилятором, работающим в системе x86, либо кросс-компилятором для x86. В противном случае он не будет иметь необходимых параметров для компиляции двоичных файлов для процессоров x86, в которые входит что-либо с SSE2.

В вашем случае процессор вообще не поддерживает x86. В зависимости от вашего дистрибутива Linux могут быть пакеты с уровнем эмуляции Intel IA32EL для x86-software-on-IA64, который может позволить вам запускать программное обеспечение x86.

Поэтому у вас есть следующие опции:

  • Используйте кросс-компилятор, который будет запускаться на IA64 и создавать двоичные файлы для x86. Кросс-компилятор toolchains не так-то просто настроить, потому что вам нужно больше, чем просто компилятор (binutils, библиотеки и т.д.).

  • Используйте Intel IA32EL для запуска собственного компилятора x86. Я не знаю, как вы собираетесь устанавливать встроенную привязку x86 и все библиотеки, которые нужны вашему проекту в ваших дистрибутивах, не поддерживают ее напрямую. Возможно, полномасштабная chroot'ed установка дистрибутива x86?

Затем, если вы хотите протестировать свою сборку на этой системе, вам необходимо установить Intel IA32EL для Linux.

EDIT2:

Предположим, вы также можете запустить полный дистрибутив x86 linux на эмуляторе вроде Bochs или QEMU (без виртуализации, конечно). Вы, конечно, не будете ослеплены результирующими скоростями.

Ответ 2

Процессор должен иметь возможность выполнять установки SSE2, и компилятор должен иметь возможность их генерировать.

Чтобы проверить, поддерживает ли ваш процессор SSE2:

# cat /proc/cpuinfo

Он будет где-то под "флагами", если он поддерживается.

Обновление: значит, CPU не поддерживает его.

Для компилятора:

# gcc -dumpmachine
# gcc --version

Цель вашего компилятора должна быть своего рода x86 *, так как только этот cpus поддерживает sse2, который является частью набора инструкций x86

и

Версия gcc должна быть >= 3.1 (скорее всего, так как это около 10 лет или что-то еще) для поддержки SSE2.

Обновление: поэтому ваш компилятор не поддерживает его в этой цели, это будет, если вы используете его как кросс-компилятор для x86.

Ответ 3

использовать asm для проверки существования sse2

enter code here
static
bool HaveSSE2()
{
    return false;
    __asm mov EAX,1              ;
    __asm cpuid                  ;
    __asm test EDX, 4000000h     ;test whether bit 26 is set
    __asm jnz yes                ;yes
    return false;
yes:
    return true;
}

Ответ 4

Еще один трюк, о котором еще не упоминалось:

gcc -march=native -dM -E - </dev/null | grep SSE2

и получим:

#define __SSE2_MATH__ 1
#define __SSE2__ 1

С -march = native вы проверяете как свой компилятор, так и ваш CPU. Если вы укажете другой -march для определенного процессора, например -march = bonnell, вы можете проверить этот CPU.

Обратитесь к своим gcc-документам для правильной версии gcc:

https://gcc.gnu.org/onlinedocs/gcc-4.9.0/gcc/Submodel-Options.html

Ответ 5

Попробуйте запустить:

lshw

и посмотрите в разделе процессора.