2010-11-17 21 views
10

En realidad tengo 2 preguntas:Cómo probar si su SSE2 Soporte Linux

  1. ¿Es un problema de compatibilidad SSE2 CPU o un problema del compilador?
  2. ¿Cómo comprobar si su CPU o compilador son compatibles con SSE2?

estoy usando GCC Versión:

gcc (GCC) 4.5.1 

Cuando traté de compilar un código que me da este error:

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

Y cpuinfo mostró esto:

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 
+0

Está utilizando un GCC que se dirige a IA64 por defecto. El conjunto de instrucciones IA64 es radicalmente diferente al de x86. Si desea compilar para x86, debe esencialmente compilar de forma cruzada su binario. – thkala

+7

También tiene un procesador Itanium2, que no tiene soporte nativo para el conjunto de instrucciones x86. Incluso si haces una compilación cruzada de tu binario para x86, probarlo en este sistema será difícil, si no imposible. – thkala

+0

¿Qué distribución de Linux está usando por cierto? – thkala

Respuesta

6
  1. Ambos. El compilador/ensamblador debe ser capaz de emitir/manejar instrucciones SSE2, y luego la CPU necesita darles soporte. Si su binario tiene instrucciones SSE2 sin condiciones adjuntas e intenta ejecutarlo en un Pentium II, no tiene suerte.

  2. La mejor manera es consultar el manual de GCC. Por ejemplo, mi página de manual de GCC se refiere a la opción -msse2 que le permitirá habilitar explícitamente las instrucciones de SSE2 en los binarios. Cualquier GCC o ICC relativamente reciente debería ser compatible. En cuanto a su CPU, verifique la línea de banderas en/proc/cpuinfo.

Lo mejor sería, sin embargo, hacerse análisis en el código utilizando cpuid etc, para que las secciones SSE2 se puede desactivar en las CPU que no lo soportan y su código puede volver a caer en un conjunto de instrucciones más comunes .

EDIT:

Tenga en cuenta que el compilador tiene que ser un compilador nativo que se ejecuta en un sistema x86, o un compilador cruzado para x86. De lo contrario, no tendrá las opciones necesarias para compilar binarios para procesadores x86, que incluye cualquier cosa con SSE2.

En su caso, la CPU no es compatible con x86 en absoluto. Dependiendo de su distribución de Linux, puede haber paquetes con la capa de emulación Intel IA32EL para x86-software-on-IA64, que puede permitirle ejecutar software x86.

por lo tanto tiene las siguientes opciones:

  • utilizar un compilador cruzado que se ejecutará en IA64 y producir binarios para x86. Las cadenas de herramientas de compilación cruzada no son fáciles de configurar, porque se necesita mucho más que solo el compilador (binutils, bibliotecas, etc.).

  • Utilice Intel IA32EL para ejecutar un compilador x86 nativo. No sé cómo haría para instalar una cadena de herramientas x86 nativa y todas las bibliotecas que su proyecto necesita en sus distribuciones no son compatibles directamente. ¿Quizás una instalación chroot'd completa de una distribución x86?

Entonces, si quieres poner a prueba tu configuración en este sistema que tiene instalar ia32el de Intel para Linux.

Edit2:

supongo que también podría funcionar con una distribución de Linux x86 completo en un emulador como Bochs o QEMU (sin virtualización, por supuesto). Definitivamente usted no va a quedar deslumbrado por las velocidades resultantes.

+0

gracias. Pls ver la actualización anterior. ¿Cómo se marcan las banderas? Mi información de la CPU anterior no parece mostrar eso. – neversaint

10

La CPU debe ser capaz de ejecutar las intromisiones de SSE2, y el compilador necesita ds para poder generarlos.

Para comprobar si su CPU soporta SSE2:

# cat /proc/cpuinfo 

Será en algún lugar bajo "banderas" si es compatible.

Actualización: Por lo que su CPU no es compatible.

Para el compilador:

# gcc -dumpmachine 
# gcc --version 

blanco de su compilador necesita una especie de x86 *, ya que sólo este SSE2 apoyo CPUs, que forma parte del conjunto de instrucciones x86

Y

La versión de gcc necesita ser> = 3.1 (lo más probable, ya que tiene unos 10 años o algo así) para admitir SSE2.

Actualización: Por lo que su compilador no es compatible con este objetivo, lo hará si lo está utilizando como un compilador cruzado para x86.

+0

Creo que el soporte SSE/SSE2 se introdujo en GCC-3.1 – thkala

+0

Sí, está en lo correcto: http: // gcc.gnu.org/gcc-3.1/changes.html. He actualizado mi respuesta. – hirschhornsalz

+0

'grep -o sse2/proc/cpuinfo' es útil, ya que hay muchas banderas que revisar en algunas CPU. –

1

intente ejecutar:

lshw 

y busque en la sección del procesador.

+0

, ¿verdad? -1 – osgx

+0

bien, tal vez no todo, pero una parte justa –

3

uso asm para comprobar la existencia de 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; 
} 
+0

Esto se parece a la sintaxis de MSVC asm, por lo que no puede usarlo fácilmente en Linux. También parece defectuoso, con un 'return false;' como primer enunciado. Sería "más limpio" colocar la etiqueta 'yes:' dentro de una declaración de asm; esto parece saltar a una etiqueta C desde una declaración asm, lo que hace que la vida del compilador sea más difícil. Probablemente sea mejor simplemente extraer ese bit en un booleano verdadero/falso en lugar de usar una rama condicional. –

3

Otro truco aún no se ha mencionado es hacer:

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

y obtener:

#define __SSE2_MATH__ 1 
#define __SSE2__ 1 

Con -march = te nativa están comprobando tanto su compilador como su CPU. Si le da una marca diferente para una CPU específica, como -march = bonnell, puede verificar esa CPU.

consulta tus documentos gcc para la versión correcta de gcc:

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

+0

¿cómo puedo desactivar el SSE2? –

Cuestiones relacionadas