Pregunta

Cada nueva generación de CPU introduce algunos conjuntos de nuevas instrucciones, es decir, MMX, 3DNOW, SSE y así sucesivamente.

Tengo algunas preguntas generales acerca de ellos:

  1. Si algunos de los usos del programa de instrucción de ejemplo pueden SSE se pueden ejecutar en la CPU que no soporta SSE?
  2. En caso afirmativo, ¿quiere decir que aquellos instrucción será cambiado a un número mayor de instrucciones simples?
  3. Si no es así, quiere decir que el impacto en el rendimiento real de estas nuevas instrucciones será después de unos años, cuando la mayoría de la CPU va a apoyar este tipo de tecnología (por lo que no habrá ningún incompatibilidades)?
  4. Cuando puedo compilar un programa en C ++ con optimizaciones quiere decir que vamos a usar algunas de estas nuevas instrucciones? (Sé que depende de muchos factores, sobre todo en el código, pero quiero un poco de respuesta general). ¿O están reservados principalmente para programas escritos en asm?
¿Fue útil?

Solución

1) Sí y no: La CPU se los considera no válida, pero si el programa comprueba si la CPU es compatible con esas instrucciones, entonces se pueden repliegue a una versión que no utiliza esas instrucciones, lo que permite que el programa sea ejecutar de todos modos.

2) El programa tendrá que proporcionar una implementación alternativa que utiliza los más instrucciones "básicas", y saber cuándo usar cuál.

3) Debido a que el programa puede comprobar la CPU, los beneficios pueden estar disponibles en este momento, pero por supuesto, si los usuarios utilizan las CPU que no soportan esas instrucciones, no van a ver ningún beneficio.

4) Esto dependerá enteramente del compilador y el optimizador. Algunos de los conjuntos de instrucciones pueden ser considerados lo suficientemente mayor que el compilador siempre se use a menos que diga que no, mientras que otro será el contrario: hay que indicar al compilador para usarlos. Si es o no creará automáticamente retrocesos, así también va a depender del compilador.

Otros consejos

Para más detalles sobre la respuesta de Michael Madsen para la pregunta 4, incumplimientos CCG para la generación de código para un procesador i386. Proporciona una bandera llamada -march (también conocido como -mcpu) que determina qué tipo de instrucciones El compilador emitir. cl.exe de Microsoft ofrece banderas /arch: y /Gx para el mismo propósito.

La bandera también afecta a cómo se ordenan las instrucciones, ya que diferentes CPUs pueden ser relativamente más lento o más rápido de ejecutar una determinada pieza de código, en función del orden en el que aparecen las instrucciones.

No estoy al tanto de cualquier compilador estática que va a crear conjunto de características automática de código de reserva. Por lo general, que se debe hacer explícitamente por el programador. Pero la buena noticia es que esa necesidad no sea programador; por ejemplo, la biblioteca liboil (Optimized de bucles internos) será, en tiempo de ejecución, seleccione el mejor código para funcionar dependiendo de la máquina que está siendo ejecutado en.

Un ejecutable que contiene nuevas instrucciones sólo se puede ejecutar en la CPU de que el apoyo de estas nuevas instrucciones. Puede configurar el compilador para compilar para una CPU específica.

MMX ha estado presente desde 1996, SSE salió en 1999, y SSE2 debutó con el Pentium 4 en 2001. Creo que es seguro asumir que cualquier CPU que va a utilizar tiene MMX y SSE, SSE2 y probablemente. 3DNOW Creo que es AMD solamente, así que no esperes esas instrucciones estén disponibles.

  
      
  1. Si algunos de los usos del programa de instrucción de ejemplo pueden SSE se pueden ejecutar en la CPU que no soporta SSE?
  2.   

No. Pero, en general, esto a menudo genera una trampa o una excepción, y la trampa / manejador de interrupciones que puede procesar si es necesario.

Por ejemplo hace mucho tiempo, a menudo contienen softwares de código para x87. Si existe el coprocesador x87, la instrucción se ejecutará normalmente en hardware, pero si el equipo carece de un coprocesador x87 entonces va a generar una trampa, después de que la instrucción será procesada en el software y el retorno resultado como normal. Ver Cuál es el protocolo para la emulación de punto flotante x87 en MS-DOS?

Las primeras versiones de Hackintosh también utilizar esto para emular SSE2 en las CPU que no soportan este conjunto de instrucciones. Por supuesto, el rendimiento es terrible, pero se ejecutará.

  
      
  1. Si no es así, quiere decir que el impacto en el rendimiento real de estas nuevas instrucciones será después de unos años, cuando la mayoría de la CPU va a apoyar este tipo de tecnología (por lo que no habrá ningún incompatibilidades)?
  2.   

Sí. Pero al cabo de unos años, tal vez softwares necesitan actualizaciones, ¿verdad? Por un software de rendimiento crítica, una reescritura de aprovechar el nuevo conjunto de instrucciones puede ser necesaria. Para otros, el aumento de rendimiento no puede ser apreciable

  
      
  1. Cuando puedo compilar un programa en C ++ con optimizaciones quiere decir que vamos a usar algunas de estas nuevas instrucciones? (Sé que depende de muchos factores, sobre todo en el código, pero quiero un poco de respuesta general) o son reservados sobre todo para los programas escritos en asm?
  2.   

Depende del compilador y opciones de pasar a ella en tiempo de compilación.

lo que van a detectan expresiones idiomáticas comunes y optimizarlo . Sólo tiene que recompilación para aprovechar el nuevo conjunto de instrucciones. Sin embargo, para los casos complejos que todavía tienen que mano a optimizar usando SIMD intrínsecos

Si utiliza un biblioteca externa , obtendrá automáticamente una mejora de la velocidad cuando la biblioteca se actualiza para soportar el nuevo conjunto de instrucciones, incluso si usted no hace nada con su programa

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top