Как проверить, поддерживает ли ваша 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
и посмотрите в разделе процессора.