Gravatar de Armonth

Introducción a la compilación de binarios según arquitectura

Está entrada ha sido motivada por lo escrito en la anterior.

Cuando un programador escribe un programa lo hace en un lenguaje de programación de tal forma que él lo entienda parecido: un lenguaje parecido a los lenguajes humanos que existen aunque algunos podrían saltar con el chiste de Perl y el cifrado RSA pero lo dejaremos correr.

La acción de compilarlo consiste en convertir el código fuente en código máquina (ceros y unos) para el ordenador: un binario.

Al compilar puedes hacer que el binario se aproveche de ciertas instrucciones que incorpora la CPU, por ejemplo puedes hacer que un reproductor/codec de vídeo aproveche las instrucciones MTRR (disponibles en cualquier CPU de arquitectura x86 superior — y incluyendo — el Pentium Pro) para mejorar hasta por 2 veces y media el procesado de gráficos. Un mismo ordenador, con la misma CPU pero con esta instrucción puede mostrar hasta 2.5 veces más gráficos.

Cada instrucción puede servir para distintas cosas (las MTRR mejoran la velocidad con gráficos, ACPID la gestión de energía, HT el procesamiento paralelo y un buen etcétera, esto a grandes rasgos) pero si creas un binario que utiliza un juego de instrucciones no soportado por la CPU simplemente no se ejecutara.

Es por eso que en GNU/Linux algunas distribuciones como Debian tienen todos sus paquetes precompilados para un juego de instrucciones simple o lo que se suele decir “i386″ (CPU 386 o superior). Si mal no recuerdo:

  • i386: procesadores Intel 386.
  • i486: procesadores Intel 486.
  • i586: procesadores Intel Pentium o superiores hasta el PIII.
  • i686: procesadores Intel Pentium 4.

Luego, los AMD entran también en esa definición pero dentro de sus equivalentes, por ejemplo un AMD K-2 entraría dentro de un i586.

Si generas un binario pensado para i386 no aprovechara — en principio ya que siempre puede hacer comprobaciones en tiempo de ejecución — instrucciones propias de CPUs más modernas pero se ejecutara sin fallar en todas ellas.

Si generas un binario para i586, aprovechará las instrucciones de la CPU más simple de las que hay en esa categoría, funcionara en CPU’s i686 pero no en anteriores…

Es por ello que Debian y algunas distribuciones en su afán de soportar el máximo de equipos posibles precompilan sus paquetes para i486.

Si se quiere más rendimiento y sacar el máximo rendimiento, el siguiente paso trata por compilar los programas: aquí entran muchos factores que pueden desaconsejar la práctica:

  • Falta de conocimientos: no saber compilar los paquetes.
  • Mala optimización: si no sabes qué características del compilador te van a servir para generar un binario para tu CPU puede que el binario resultante sea incluso menos eficiente que uno precompilado.
  • Falta de mejoras apreciables: compilar OpenOffice, KDE, el kernel linux, etcétera pueden resultar en una mejora de velocidad apreciable, pero compilar ls puede servir para ganar 0.000001seg lo cual no merece el esfuerzo.
  • Actualizaciones a tiempo: a veces sale más a cuenta actualizar un binario precompilado aunque sea un poco menos eficiente que estar 24h con la CPU al 100% para compilarlo (y en casos como OpenOffice no es ninguna exageración).

Con todo lo dicho, Switfox (ver entrada anterior) puede ser interesante (Firefox es uno de los programas que suele ser útil compilar) aunque lo malo es que luego quieres compilar el núcleo, el KDE/Gnome, el OpenOffice… y al final si lo que quieres es máximo rendimiento y compilarlo todo te sale más a cuenta usar como distribución Gentoo o Slackware.

2 Comentarios (feed)

  1. Gravatar de Pancho Pancho nos comenta:

    Nomas una aclaración

    El i586 no son procesadores Intel Pentium o superiores hasta el PIII, es solamente el juego de instrucciones del pentium, y el i686 es el juego de instrucciones del pentium pro en adelante, pentium pro, pentium 2, etc,

    http://en.wikipedia.org/wiki/I686

    saludos.

    Miércoles, 17 de Enero/2007 @ 6:03

  2. Gravatar de Armonth Armonth nos comenta:

    Gracias por la aclaración, a veces he leído el tema usando x86, x86_32, ia32×86 y i386 para decir lo mismo y la verdad es que uno a veces termina líado…

    En cualquier caso y hablando de forma estricta, creo que se debería usar i586 y i686 tal como tú has dicho (y que el i486/i386 dejarlos sin la i para referirnos directamente al procesador especifico)…

    Miércoles, 17 de Enero/2007 @ 6:40

No seas tímido, da tu opinión

Sé respetuoso con los demás, la diferencia de opiniones enriquece la discusión, los comentarios bajo ciertas circunstancias pueden ser moderados y requerir aprobación.