SoundConverter y la Computación Multi-core

SoundConverter es un programa de GNOME que permite traspasar música de cualquier formato (Ogg Vorbis, AAC, MP3, FLAC, WAV, AVI, MPEG, MOV, M4A, AC3, DTS, ALAC, MPC, Shorten, APE, SID, etc.) a otros formatos (WAV, FLAC, MP3, AAC, and Ogg Vorbis).

Lo bueno es que está pensado para ser sencillo y a la vez potente. Por ejemplo en mi equipo que tiene 4 núcleos, comprime de a 4 archivos a la vez. Es una de las primeras aplicaciones que observo que logran aprovechar al máximo el AMD Phenom X4 sin requerir intervención del usuario o una estrategia de uso compleja para aumentar el trabajo que se realiza en paralelo.

Es difícil hacer aplicaciones que usen correcta y eficientemente varios núcleos. En algunas aplicaciones es tan difícil que nadie se toma el trabajo. En este caso particular es muy sencillo y por suerte se tomaron el trabajo de hacerlo. En mi experiencia, se puede ahorrar hasta un 70% del tiempo de codificación usando cuatro núcleos en lugar de uno.

Por supuesto que está en los repositorios de Ubuntu.

Procesamiento en Paralelo en AMD Phenom X4

Comparé el tiempo que se tarda en traspasar 4 canciones de formato flac a formato ogg en forma secuencial y en paralelo en un procesador de cuatro núcleos como es el AMD Phenom X4 9550 en Ubuntu 8.10 de 64 bits. El resultado es asombroso.

Ejecutando en serie:

time oggenc -Q 01_threnody_in_x.flac 02_bc_blood.flac 03_goop.flac 04_soda_pop.flac)

real    0m37.265s
user    0m37.166s
sys    0m0.100s

En paralelo:

time (oggenc -Q 01_threnody_in_x.flac & oggenc -Q 02_bc_blood.flac & oggenc -Q 03_goop.flac & oggenc -Q 04_soda_pop.flac & wait)

real    0m11.697s
user    0m36.274s
sys    0m0.172s

En paralelo tarda el 31% del tiempo. Significa que casi se llega el límite teórico de reducir a un cuarto el tiempo de cálculo. Ahora resta que más aplicaciones de uno cotidiano aprovechen estas nuevos procesadores al máximo. (Notemos que hasta el comando time se confunde e informa un tiempo de usuario de 36 segundos, cuando el proceso efectivamente tardó 11 segundos).

AMD Phenom X4

Quiero hablar del procesador de AMD que disfruto en mi computadora. Es el AMD Phenom X4 9550.

En rigor son 4 procesadores (o núcleos) integrados junto al controlador de memoria en el mismo chip. Cada uno corre a 2.200 MHz y tiene 128 KB de memoria caché de nivel 1 y 512 KB de nivel 2. Además los 4 comparten 2 MB de memoria caché de nivel 3.

Cada núcleo en si mismo es rápido, supera ampliamente a un AMD Athlon X2 ejecutando a los mismos MHz, pero como 2.200 MHz no es lo más rápido que se ha visto (incluso hay modelos de este mismo procesador de hasta 2.600 MHz) al ejecutar una única tarea como por ejemplo comprimir un video o una canción a mp3 no es el procesador más rápido del mundo (ni siquiera en su familia de Phenoms).

Para sacarle todo el jugo a este Phenom hay que hacer varias cosas a la vez, o paralelizar. Obviamente que no se puede estar todo el tiempo haciendo 4 cosas, la mayor parte del tiempo tenemos suerte si hacemos 2 a la vez (escuchar música y navegar, por ejemplo). Pero hay que armarse de una estrategia para hacer más a la vez y así ganar tiempo aprovechando más y mejor el recurso.

Características que favorecen el procesamiento en paralelo

  • Ya se dijo que es un procesador de 4 núcleos, hay posibilidad de tener 4 tareas ejecutándose en paralelo.
  • 2 MB caché compartida. Este tipo de caché es necesaria porque la caché de cada núcleo suele perder eficacia cuando una tarea que se estaba ejecutando en un núcleo es programada para ejecutarse en otro por el sistema operativo. La caché compartida no tiene ese problema. Fíjense que la versión II del Phenom X4 tiene entre 4 y 6 MB de caché compartida.
  • Acceso a memoria en unganged mode: en teoría permite que diferente núcleos accedan a la memoria en forma independiente en determinadas circunstancias. En algunas aplicaciones hay beneficio. Aunque ese test ejecuta una única tarea a la vez. Sería deseable ver qué pasa cuando se ejecutan diferentes tareas en forma paralela. Ahí hay más probabilidad de que el método de acceso unganged mejore la performance.

La velocidad de una computadora con este procesador en tareas cotidianas es tan rápida como se desea. Lo único que retrasa la experiencia es la conexión a Internet. Para aprovechar este procesador al máximo en tareas que insumen mucho tiempo la clave es dividir el trabajo y paralelizarlo.

Tarea 1: comprimir un CD a MP3

Este tipo de tarea consta de 2 fases, extraer a música del CD (ripping) y la compresión a MP3 (u OggVorvis, FLAC, AAC, el preferido). La primera fase es muy importante para evitar ruidos en el sonido y además requiere muy poco procesador y mucho de leer de la unidad de CD.

Paso 1: ripear el CD a WAV sin comprimirlo. Eso lo podemos hacer en segundo plano mientras hacemos otras cosas.

Paso 2: ejecutar 3 procesos de compresión en forma simultánea, cada una con un subconjunto de las canciones extraídas del CD.

Con seguridad podremos seguir usando la PC como si nada pasara mientras se comprimen las canciones y además si comprimir 12 canciones tardaba 12 minutos, de esta forma en aproximadamente 5 minutos habremos terminado.

Tarea 2: comprimir un DVD a DivX (o Xvid, Theora, el preferido de cada uno)

Lo ideal es copiar el contenido del DVD a una carpeta del disco para evitar estar leyendo de la unidad de DVD todo el tiempo.

En este caso no es tan simple dividir la tarea, pero uno siempre tiene la duda de si elegir tal o cual calidad. Ya no más problemas, elegimos ambas calidades y largamos a comprimir simultáneamente con las 2 calidades ejecutando 2 instancias del programa de compresión.

Lo mismo si se duda entre un codec y otro, podemos largar ambos codecs en 2 instancias del programa en paralelo.

Es probable que cada tarea individual tarde un poquito más al estar ejecutándose en paralelo que si lo hace sola, pero lo que es seguro es que ese tiempo de más nunca será cercano al que tardaríamos ejecutado primero una y luego la otra.

Esto último yo lo hice con un DVD que quería pasar a un formato más comprimido usando Thoggen. Puse 3 instancias de Thoggen a comprimir el video que había copiado del DVD al disco. En 4 horas tenía 3 versiones de diferentes calidades para elegir la que más me gustara. Lo mejor es que durante esas 4 horas, podía usar la PC como si nada para las tareas cotidianas.

Para este tipo de tareas ayuda mucho, diría que es indispensable, tener mucha RAM. Por más que tenemos 4 procesadores, el disco sigue siendo uno solo (salvo en equipos con hardware especial) y poder tener 2 o 3 GB de datos en caché de disco es muy beneficioso.

Las aplicaciones en general no están diseñadas para aprovechar la presencia de muchos procesadores. Pero las pocas que lo están realmente tienen un rendimiento extremo en este procesador. En mi caso lo experimento con las aplicaciones Java como NetBeans. Es que Java de por sí tiene muchas cosas ejecutándose a la vez y particularmente el garbage collector que es una pieza clave en la performance de esta plataforma. Netbeans es una de las pocas aplicaciones que en algún momento utiliza los 4 procesadores (aunque brevemente).

Energía

Para la mayoría de la gente, el ahorro de energía no es importante, pero sí el ruido del los ventiladores de la PC. Este procesador consume típicamente 95 W de potencia (en realidad 95W es tu thermal design power o TDP), y los ventiladores andan a 4.500 RPM como máximo. Pero tiene una característica de ahorro de energía que hace que los ventiladores bajen hasta 3100 RPM según la carga. Es que cada núcleo, puede ejecutarse a la velocidad de 2.200 MHz o a la mitad (1.100 MHz) cuando no hay nada que hacer. Esto ahorra energía, baja la temperatura del procesador y reduce la velocidad de los ventiladores haciéndolos más silenciosos. A pesar de no ser un procesador de una portátil, tiene esta funcionalidad y lo notable es que cada núcleo regula independientemente su velocidad según la carga que tiene en cada momento.

Para esto hay soporte en Windows y Linux, por supuesto. Lo único que noto a veces es que en Windows los ventiladores suelen estar más tiempo a menor velocidad, pero en Linux puedo monitorear segundo a segundo a qué velocidad de reloj está ejecutándose cada núcleo.