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

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

  1. является ли совместимость SSE2 проблемой процессора или компилятора?
  2. Как проверить, поддерживает ли ваш процессор или компилятор 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

5 ответов


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

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

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

EDIT:

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

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

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

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

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

EDIT2:

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


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

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

# cat /proc/cpuinfo

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

Update: таким образом, вы cpu не поддерживает его.

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

# gcc -dumpmachine
# gcc --version

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

и

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

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


еще один трюк, еще не упомянутый, это do:

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

и

#define __SSE2_MATH__ 1
#define __SSE2__ 1

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

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

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


используйте 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;
}

попробуй:

lshw -class processor | grep -w sse2

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