Как проверить, поддерживает ли ваш Linux SSE2 - PullRequest
14 голосов
/ 17 ноября 2010

На самом деле у меня есть 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 ]

14 голосов
/ 17 ноября 2010

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

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

# cat /proc/cpuinfo

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

Обновление: так что ваш процессор его не поддерживает.

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

# gcc -dumpmachine
# gcc --version

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

И

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

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

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

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

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

РЕДАКТИРОВАТЬ:

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

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

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

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

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

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

EDIT2:

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

5 голосов
/ 14 августа 2017

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

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

и получите:

#define __SSE2_MATH__ 1
#define __SSE2__ 1

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

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

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

3 голосов
/ 04 января 2011

используйте 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;
}
2 голосов
/ 17 ноября 2010

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

lshw -class processor | grep -w sse2

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

...