22/7/12

Optimizaciones de compilacion segun el procesador


Muchas veces cuando vemos en la web parametros de compilacion como "-march" y "-mtune", se han preguntado que significan?

Bien, básicamente son flags de compilación que indican el procesador del sistema donde ejecutaremos la aplicación compilada...

Veamos los posibles valores que pueden tomar en la siguiente tabla:

Valores CPU
generic Produce un código binario optimizado para la mayor parte de procesadores existentes. Utilizar este valor si no sabemos el nombre del procesador que tenemos en nuestro equipo. Este valor sólo es aplicable en la opción '-mtune='. Esta opción está disponible a partir de GCC 4.2.x.
i386 Intel i386.
i486 Intel i486.
i586, pentium Intel Pentium sin soporte de instrucciones MMX.
pentium-mmx Intel PentiumMMX basado en Pentium con soporte de instrucciones MMX.
pentiumpro Intel PentiumPro.
i686 Produce un código binario optimizado para la mayor parte de procesadores compatibles con la serie 80686 de Intel. Todos los actuales lo son.
pentium2 Intel Pentium2 basado en PentiumPro con soporte de instrucciones MMX.
pentium3, pentium3m Intel Pentium3 basado en PentiumPro con soporte de instrucciones MMX y SSE.
pentium-m Versión de bajo consumo de Intel Pentium3 con soporte de instrucciones MMX, SSE y SSE2. Utilizado por los portátiles Centrino.
pentium4, pentium4m Intel Pentium4 con soporte de instrucciones MMX, SSE y SSE2.
prescott Versión mejorada de Intel Pentium4 con soporte de instrucciones MMX, SSE, SSE2 y SSE3.
nocona Versión mejorada de Intel Pentium4 con extensiones 64-bit y soporte de instrucciones MMX, SSE, SSE2 y SSE3.
core2 Intel Core2 con extensiones 64-bit y soporte de instrucciones MMX, SSE, SSE2, SSE3 y SSSE3. Esta opción está disponible a partir de GCC 4.3.x.
corei7 Intel Core i7 con extensiones 64-bit y soporte de instrucciones MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1 y SSE4.2. Soporta también los procesadores Intel Core i3 e i5. Esta opción está disponible a partir de GCC 4.6.x.
corei7-avx Intel Core i7 con extensiones 64-bit y soporte de instrucciones MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX, AES y PCLMUL. Soporta también los procesadores Intel Core i3 e i5. Esta opción está disponible a partir de GCC 4.6.x.
atom Intel Atom con extensiones 64-bit y soporte de instrucciones MMX, SSE, SSE2, SSE3 y SSSE3. Esta opción está disponible a partir de GCC 4.5.x.
k6 AMD K6 con soporte de instrucciones MMX.
k6-2, k6-3 Versiones mejoradas de AMD K6 con soporte de instrucciones MMX y 3DNow!.
athlon, athlon-tbird AMD Athlon con soporte de instrucciones MMX, 3DNow!, enhanced 3DNow! y SSE prefetch.
athlon4, athlon-xp, athlon-mp Versiones mejoradas de AMD Athlon con soporte de instrucciones MMX, 3DNow!, enhanced 3DNow! y full SSE.
k8, opteron, athlon64, athlon-fx Procesadores basados en AMD K8 core con soporte de instrucciones x86-64 (MMX, SSE, SSE2, 3DNow!, enhanced 3DNow! y extensiones 64-bit).
k8-sse3, opteron-sse3, athlon64-sse3 Versiones mejoradas de AMD K8 core con soporte de instrucciones SSE3. Esta opción está disponible a partir de GCC 4.3.x.
amdfam10, barcelona Procesadores basados en AMD Family 10h core con soporte de instrucciones x86-64 (MMX, SSE, SSE2, SSE3, SSE4A, 3DNow!, enhanced 3DNow!, ABM y extensiones 64-bit). Esta opción está disponible a partir de GCC 4.3.x.
btver1 AMD Bobcat (family 14). Esta opción está disponible a partir de GCC 4.6.x.
winchip-c6 IDT Winchip C6, que equivale a un i486 con soporte de instrucciones MMX.
winchip2 IDT Winchip2, que equivale a un i486 con soporte de instrucciones MMX y 3DNow!.
c3 Via C3 con soporte de instrucciones MMX y 3DNow!.
c3-2 Via C3-2 con soporte de instrucciones MMX y SSE.
geode AMD integrado con soporte de instrucciones MMX y 3DNow!. Esta opción está disponible a partir de GCC 4.3.x.
native Produce un código binario optimizado para el procesador que tengamos en nuestro sistema, siendo éste detectado utilizando la instrucción cpuid. Procesadores antiguos pueden no ser detectados utilizando este valor. Esta opción está disponible a partir de GCC 4.2.x.

Como pueden ver hay una gran variedad según la arquitectura y como me es imposible recordarlos a todos los dejo acá también para el resto de los navegantes!

19/7/12

what de UNIX en Linux

Hola a todos! Luego de algún tiempo sin escribir (exactamente 3 años, 5 meses y 7 días =P) he vuelto para traerles algo que les sera útil para aquellos que programan en C/C++ y quieren saber que fuentes contiene un binario que generaron en su proyecto.
Tal como el titulo lo dice en UNIX tenemos el comando what y en linux, si no me equivoco, "no tenemos una alternativa" a ese comando.

Básicamente el comando en UNIX se usa de la siguiente manera:
what binario
y la información que nos trae es la de los fuentes con los que se ha compilado el binario.

La particularidad que deben tener los fuentes tal como nos dice la pagina del man de unix (man what) es incluir dentro de el una linea como la siguiente:
char version_id[] = "@(#)identification information"; 
Vemos un ejemplo, escribamos un pequeño programa en C (al que llamaremos a.c), con el siguiente contenido:
 char version_id[] = "@(#)a.c v1.2";

#include

main()
{
    printf("Hola Mundo \n");
    return 0;
}
Ahora compilamos:
gcc a.c
Y esto nos generara, un binario llamado a.out.

Como comente arriba no "disponemos" del comando what en LINUX, pero lo podemos emular de la siguiente manera:
strings  a.out | grep '@(#)'
y la salida del comando anterior, como se imaginan sera:
@(#)a.c v1.2
Como ven, se puede incluir cualquier tipo de información que deseen...

Investigando un poco mas, encontré un fuente de what usado en BSD, que pueden bajar y compilar uds mismos desde aquí.

El único inconveniente que encontré al compilarlo es que no se encontraba la función
strlcpy, la cual se encuentra en la libbsd, -lbsd. Los usuarios de Debian y derivados pueden descargar sin mayor problema...

Bien, espero les sirva, se ven al rato!