2010-05-17 20 views
7

Tengo curiosidad, ¿los nuevos compiladores usan algunas características adicionales integradas en nuevas CPU como MMX SSE, 3DNow! ¿y entonces?C/C++ uso de características especiales de CPU

Es decir, en el original 8086 ni siquiera había FPU, por lo que el compilador antiguo ni siquiera puede usarlo, pero los compiladores nuevos pueden hacerlo, ya que FPU forma parte de cada CPU nueva. Entonces, ¿los nuevos compiladores usan nuevas características de la CPU?

O, debería ser más correcto preguntar, ¿las nuevas funciones de la biblioteca estándar de C/C++ usan nuevas características?

Gracias por la respuesta.

EDIT:

OK, así que, si consigo todos ustedes bien, incluso algunas operaciones standart, especialmente con números flotantes se pueden hacer usando SSE más rápido.

Para usarlo, debo habilitar esta característica en mi compilador, si es compatible. Si es así, debo asegurarme de que la plataforma específica admita esas características.

En el caso de algunas bibliotecas del sistema que requieren un rendimiento superior, como OpenGL, DirectX y así, este soporte puede ser compatible con el sistema.

De forma predeterminada, por razones de compatibilidad, el compilador no lo admite, pero puede agregar este soporte utilizando funciones C especiales entregadas por, por ejemplo, Intel. Esta debería ser la mejor manera, ya que puede controlar directamente el tiempo y cuando utiliza características especiales de la plataforma deseada, para escribir aplicaciones con soporte para múltiples CPU.

+1

En su siguiente publicación Stack Overflow, agregue líneas en blanco entre sus preguntas, ya que esto permite a las personas identificar las preguntas más fácilmente (especialmente al desarrollar respuestas para usted). –

+0

OK, gracias por su consejo. –

+0

Considere que incluso un 'complemento' básico se implementa de manera diferente en diferentes familias de procesadores. El compilador realiza los mismos movimientos básicos al elegir entre la salida PPC y la salida Intel como lo haría al elegir entre salida SSE y salida no SSE. –

Respuesta

4

gcc admitirá las instrucciones más nuevas a través de los argumentos de la línea de comando. Ver here para más información. Para citar:

GCC puede tomar ventaja de las instrucciones adicionales en el MMX, SSE, SSE2, SSE3 y extensiones 3DNow de los últimos procesadores de Intel y AMD. Las opciones -mmmx, -msse, -msse2, -msse3 y -m3dnow permiten el uso de estas instrucciones adicionales, permitiendo que se procesen varias palabras de datos en paralelo. Los ejecutables resultantes solamente se ejecutará en los procesadores de apoyo las extensiones adecuadas - en otras sistemas van a bloquearse con un error Ilegal instrucción (o similar)

1

compiladores tendrán como objetivo para la producción de código de un conjunto mínimo de características en un procesador. También proporcionan conmutadores de compilación que le permiten dirigirse a procesadores específicos. De esta manera, pueden vender más compiladores (para aquellos con procesadores antiguos y gente de moda con nuevos procesadores).

Deberá estudiar la documentación que vino con su compilador.

0

Varios compiladores utilizarán nuevas características variables. Visual Studio usará SSE/2, y creo que el compilador de Intel admitirá lo último en funciones de CPU. Por supuesto, debe tener cuidado con la penetración en el mercado de su función favorita.
En cuanto a cuál es su biblioteca estándar favorita, eso depende de con qué se haya compilado. Sin embargo, la biblioteca estándar de C++ normalmente se compila en el sitio, ya que está muy fuertemente modelada, por lo que si habilita SSE2, las librerías estándar de C++ deberían usarla. En cuanto a la CRT, depende de con qué se compilaron.

0

En general hay dos formas en que un compilador puede generar código que utiliza funciones especiales como éstas:

  1. Cuando el compilador en sí se compila, se configura para generar código para una arquitectura particular, y puede aprovechar de las características que sabe que tendrá la arquitectura. Por ejemplo, si gcc está configurado para un procesador Intel lo suficientemente nuevo (¿o es que "no es lo suficientemente antiguo"?) Para contener una FPU integrada, generará instrucciones de coma flotante.
  2. Cuando se invoca el compilador, los indicadores o parámetros pueden especificar el tipo de características disponibles para el procesador que ejecutará el programa, y ​​luego el compilador sabrá que es seguro usar estas características. Si las banderas no están presentes, generará un código equivalente sin usar las instrucciones especiales proporcionadas por esas características.
+0

* "Cuando se compila el compilador" * Uhm, ¿por qué tiene que suceder esto tan pronto como al * compilar * el compilador? –

+0

@Viktor no es así. Mi punto es que cuando compila el compilador, conoce automáticamente algunas cosas básicas sobre su plataforma de destino en función de si lo configura para generar ejecutables para 8086, Pentium, PowerPC, SPARC, lo que sea. Si compila un compilador para generar archivos ejecutables compatibles con Pentium, puede usar características especiales introducidas en la arquitectura x86 que no estaban en el 386, por ejemplo, aunque pertenezcan a la misma familia. –

1

En ocasiones, la biblioteca de tiempo de ejecución contendrá múltiples implementaciones de una característica y la biblioteca elegirá dinámicamente entre implementaciones cuando se ejecute el programa. La sobrecarga puede ser el costo de una llamada de puntero a función en lugar de una llamada de función directa, pero el beneficio podría ser mucho mayor cuando se utiliza una función optimizada específica de la CPU.

Los compiladores JIT (para lenguajes VM como Java y C#) dan un paso más y compilan el código de bytes para la CPU específica en la que se está ejecutando. Esto le da a su propio código el beneficio de una optimización de CPU específica. Esta es una razón por la cual el código Java puede ser realmente más rápido que el código C compilado, porque el compilador Java JIT puede retrasar sus decisiones de optimización hasta que el programa se ejecute en la máquina objetivo real. Un compilador de C debe tomar esas decisiones sin saber siempre cuál es la CPU objetivo. Además, los compiladores JIT evolucionan y pueden hacer que su programa sea más rápido con el tiempo sin tener que hacer nada.

0

Si habla de código escrito en C/C++, las nuevas funciones se explotan si le dice al compilador que lo haga. De forma predeterminada, su compilador probablemente tenga como objetivo "plain x86" (naturalmente con FPU :)), generalmente optimizado para la generación de procesadores más extendida en este momento, pero aún capaz de ejecutarse en procesadores más antiguos.

Si desea que el compilador genere código también teniendo en cuenta los nuevos conjuntos de instrucciones, debe indicarlo con el conmutador de línea de comando/configuración del proyecto apropiado, por ejemplo para Visual C++ la opción de habilitar la generación de instrucciones SSE/SSE2 es /arch.

Observe que muchas características de los nuevos conjuntos de instrucciones no pueden explotarse directamente en el código "normal", por lo que generalmente se proporcionan intrínsecos del compilador para operar en los tipos de datos particulares nativos de los nuevos conjuntos de instrucciones.

1

Si usa el compilador Intel C y establece opciones de optimización lo suficientemente altas, encontrará que algunos de sus bucles se 'vectorizan', lo que significa que el compilador los ha reescrito para usar instrucciones de estilo SSE.

Si desea utilizar las operaciones SSE directamente, utilice las características intrínsecas definidas en el archivo de encabezado 'xmmintrin.h'; decir

# include <xmmintrin.h>

__m128 U, V, W; flotante ww [4];

V = _mm_set1_ps (1.5);

U = _mm_set_ps (0,1,2,3);

W = _mm_add_ps (U, V);

_mm_storeu_ps (ww, W);

0

Intel proporciona un código de ejemplo actualizado de CPUID cada vez que lanzan una nueva CPU para que pueda verificar las nuevas características y haya estado todo el tiempo que recuerdo. Al menos esto es lo que encontré la primera vez que pensé en la misma pregunta yo mismo.

Using CPUID to Detect the presence of SSE 4.1 and SSE 4.2 Instruction Sets

Como nuevos compiladores son liberados agregan las nuevas características directamente como VS2010 por ejemplo. Visual C++ Code Generation in Visual Studio 2010