64 bits son más del doble de 32, por Juan de Dios Santander Vela

jdsant_2004_05_11_80x80.jpgSe han escrito ya muchos artículos sobre la importancia de que los nuevos procesadores disponibles en sistemas de escritorio, como el PowerPC G5 (PowerPC 970 si seguimos la nomenclatura de IBM), o los Athlon64 y Opteron.

Sin embargo, el lector medio sigue con la duda: ¿qué son estos 64 bits, y qué puedo hacer con ellos que no hacía antes?

Hagamos un poco de “retrocomputación”: en los tiempos del Spectrum, el Commodore 64, los Amstrad CPC, etcétera, se hablaba de ordenadores de 8 bits. Poco después, la entrada de ordenadores como el Sinclair QL, y los Atari ST, así como los primeros PCs con procesadores 8088/8086, dieron lugar a la computación de 16 bits.

El Mac II, así como los 80386, dieron lugar a la era de los 32 bits, en la que nos hemos encontrado hasta el lanzamiento del PowerPC 970 (alias G5), y los Athlon64 y Opteron.

Matemáticas de dos dedos

El sistema de numeración de base diez que utilizamos está basado en el hecho de que tenemos diez dedos. Cuando queremos contar cosas que sobrepasan al número de dedos que tenemos, volvemos a contar desde cero, pero en algún sitio llevamos la cuenta de que hemos sobrepasado una unidad. Cada grupo “mayor” (cada vez que pasamos la cuenta de diez) lo representamos como un dígito.

Pensemos en un formulario en el que se nos pida el número de hijos.

Normalmente, serán menos de diez, por lo que con una casilla es suficiente, y se pueden representar valores de 0 a 9.

Si en cambio nos preguntan la edad y somos trabajadores en activo, bastarán dos casillas, y podremos representar una edad de 0 a 99. De hecho, necesitamos dos casillas aunque la edad sea siempre menor de 70 años —hay profesiones con edades de jubilación más tardías; no creo que sea una suerte ;-)— y mayor de 16, siguiendo el ejemplo.

Y si nos preguntan nuestro año de nacimiento, podemos utilizar cuatro cifras, lo que nos da un rango de numeración de 0 a 9999.

Es decir, para un dígito, tenemos diez posibilidades: de 0 a 9. Para dos dígitos, tenemos 10 posibilidades en las decenas por cada diez posibilidades en las unidades (10*10, o de 0 a 99). Expresado de forma matemática, el valor máximo que se pueden conseguir con n cifras decimales es 10^n – 1 (10 elevado a n menos 1, o lo que es lo mismo 10*10*…*10 n veces menos 1).

Si tuvieramos sólamente dos dedos, numerados 0 y 1, tardaríamos muy poco en necesitar más cifras: 0, 1, 10, 11, 100, 101, 110, 111, 1000 (contando desde 0 hasta 8, por ejemplo). Llamamos bit (contracción del inglés “BInary digiT”, dígito binario) a cada una de esas cifras.

Pero, ¿cuánto es un bit, y de cuánto en cuánto los agrupamos?

Un bit es la mínima unidad de información, y viene a ser la respuesta sí o no a una determinada pregunta. Normalmente, se utiliza la presencia o no de un determinado nivel de corriente para saber si un bit presenta un estado u otro.

Pero un bit nos da poco juego: sí, nos permite saber si se cumple o no una determinada condición, pero para representar letras y números en mayúsculas, y algunos signos de puntuación, necesitamos al menos 26 letras + 10 números + 12 signos (!/). Eso nos da 48 caracteres diferentes, y la potencia de dos más cercana es 64 (2^5=32, 2^6=64), por lo que necesitaríamos un mínimo de 6 bits para ese tipo de transmisiones. Además, dispondríamos de otros 16 caracteres adicionales, que se pueden utilizar para mandar datos de control. De hecho, estos 6 bits eran lo que se utilizaba para las comunicaciones por teletipo.

Pero 6 no es una potencia de dos (esto es, 2^2=4, y 2^3=8), de modo que pronto se pasó a los 8 bits. Y pronto vamos a ver por qué 64 es más del doble de 32… bastante más del doble 😉

En efecto, hemos visto que para codificar 64 símbolos diferentes necesitábamos 6 bits, y con 8 bits se pueden codificar 256 símbolos diferentes. Es decir, un incremento del 25% en el número de bits nos ha llevado a multiplicar por 4 nuestra capacidad de codificación.

Tal y como hemos visto anteriormente, el valor máximo que se puede representar con n dígitos binarios es 2^n – 1. Estos valores máximos están relacionados con el número de símbolos diferentes que es posible representar con un conjunto determinado de dígitos/bits.

Por poner un ejemplo: el número máximo con cinco cifras decimales es 99.999, o lo que es lo mismo, 10 elevado a 5 menos 1. El número más grande en binario con 8 bits es 11111111, que pasado a decimal se convierte en 255 (2 elevado a 8 menos 1).

Bits a porrillo

En la mayoría de los ordenadores actuales podemos dibujar un diagrama de este tipo:

juandeimg1.png
Clic para ampliar

En este diagrama, podemos ver que existe un mecanismo de comunicación entre la CPU, la memoria, y los diversos periféricos, todo ello gobernado a una determinada velocidad de reloj. Cada una de esas interconexiones (buses, porque sirven para el transporte de información) puede tener un ancho diferente, de 8, 16, 32, 64, 128 bits… Ése es el ancho del bus.

Dentro de la CPU, o unidad central de proceso, podemos dibujar un diagrama parecido, en este caso el correspondiente a un procesador Intel 8080:

juandeFigBus.jpg
Clic para ampliar

De nuevo, vemos cómo existen diferentes caminos de interconexión entre los elementos del procesador. En este caso, los anchos vienen dados entre paréntesis, y podemos ver cómo un 8080 (y también el Z80, una versión mejorada de este procesador presente en los añorados Spectrum, MSX y Amstrad CPC) tiene registros y buses de 8 bits.. Dentro de estos procesadores la velocidad de reloj es constante.

Nótese que hay dos registros especialmente importantes: el Contador de Programa (Program Counter, o Instruction Pointer en otros procesadores), y el Puntero de Pila (Stack Pointer). En los procesadores de 8 bits solían medir 16 bits, para poder acceder a 2^16 = 65.536 posiciones de memoria diferentes, los famosos 64KB de la época 😉 Sin embargo, el resto de los registros, y los buses internos, tienen un ancho de 8 bits, lo que los caracterizaba como procesadores de 8 bits.

Desde aquella época, pasamos por el 8088 (8 bits externos, 16 bits internos, con 20 bits para memoria), el 8086 (igual que el 8088 con 16 bits externos), el 68000 (32 bits en registros, 16 bits internos y externos, con 24 bits para memoria), y acelerando rápidamente, los Pentium III (32 bits en registros, 64 bits internos y externos), PowerPC G3 (32 bits en registros, 64 bits internos y externos), Pentium IV (32 bits en registros, 128 bits internos, 64 bits externos), PowerPC G4 (32 bits en registros, 128 bits internos, 64 bits externos), y PowerPC G5 (64 bits en registros, 128 bits internos, 128 bits externos).

Matemáticas del acceso a memoria

O lo que es lo mismo: ¿cuánta memoria puedo instalar, y cuánto me cuesta operar con esos datos?

En un procesador de 8 bits, los registros de acceso a memoria eran típicamente de 16 bits, con lo que conseguíamos acceder a 64KB de memoria a la vez. Ordenadores como el Spectrum 128KB, los MSX, o los Amstrad CPC de más de 64KB utilizaban bloques de 16KB para ver a la vez un máximo de 64KB simultáneos, por mucha memoria que se tuviera instalada.

Con el paso a 32 bits, se duplicó el número de bits para identificar las posiciones de memoria accesibles al procesador, pero eso multiplicó por 65.536 el número de posiciones diferentes, hasta llegar a 2^32 = 4.294.967.296, lo que comúnmente se conoce como 4GB.

Pasamos a 64 bits: de nuevo duplicamos el número de bits disponibles para acceder a posiciones de memoria diferentes, pero en este caso, el factor multiplicador sobre el tope anterior es de más de 4 mil millones de veces: los 16EB (exabytes) teóricamente accesibles para estas nuevas máquinas permitirían que una única máquina tuviera más memoria de la que tienen todos los ordenadores personales actualmente conectados a Internet. Claro que esto es sólo en teoría, porque con los costes y técnicas de fabricación actuales, tenemos que conformarnos solamente con multiplicar por 4 o por 8 la memoria máxima instalable por máquina, y en la práctica los límites son más modestos (8GB en los Power Mac G5, por ejemplo).

La potencia de cálculo también se multiplica

Bueno, queda claro que podemos llegar a disponer de mucha, muchísima memoria, pero hemos oído que los PowerPC G5 también son mucho más potentes que los G4 manteniendo la misma velocidad de reloj. ¿Cuál es el factor de multiplicación aquí?

Tomemos un ejemplo de los cuadernos Rubio: queremos sumar dos números de dos cifras, por ejemplo 53 y 29. Para hacer la operación, en primer lugar utilizamos la parte menos significativa de ambos números (3 y 8, en este caso), y los sumamos. El resultado es 12, pero eso es mayor que 9, de modo que dejamos la cifra menos significativa del resultado (2), y decimos que “nos llevamos” (tenemos un acarreo, en terminología técnica) 1. Fijémonos en que el acarreo _nunca_ puede ser mayor que uno.

A continuación, sumaremos las partes más significativas, 5 y 2, _y añadimos_ el acarreo: resultado, 8, y el total de la suma, por tanto, es 82.

Imaginemos ahora que fuésemos capaces de sumar de golpe números de dos cifras: en ese caso, la suma de 1234 con 5678 se dividiría en la suma de 34 y 78 (12, con acarreo de 1), y la de 12 y 56 y el acarreo (69), de modo que en dos pasos hemos llegado a la conclusión de que 1234 + 5678 = 6912.

Estamos ya en condiciones de entender el siguiente ejemplo: queremos sumar dos números de 64 bits, A y B, y guardar el resultado, y un tercer número, C, en memoria.

En un procesador de 32 bits, tendríamos que:

a) Cargar los dos números en trozos de 32 bits (4 instrucciones)

b) Utilizar cuatro registros (uno por cada trozo)

c) Sumar los trozos menos significativos de A y B, quedarnos con el acarreo de la suma, y sumar las partes más significativas de A y B y el acarreo (2 instrucciones). No se puede paralelizar la instrucción, porque la suma de las partes más significativas necesita el registro del acarreo.

d) Guardar el resultado de 64 bits, y un tercer número C, en memoria: de nuevo, cuatro trozos de 32 bits, con las correspondientes cuatro instrucciones de almacenamiento.

Sin embargo, en un procesador de 64 bits:

a) Cargar dos números de 64 bits (2 instrucciones, una por número)

b) Utilizar dos registros en el procesador (uno por número)

c) Sumar A y B en una instrucción (sin utilizar acarreo)

d) Guardar el resultado de 64 bits, y el tercer número C en memoria: dos instrucciones de almacenamiento

El resultado final es que hemos utilizando la mitad de instrucciones, la mitad de registros, y además no se ha utilizado el registro de acarreo, de modo que los recursos utilizados son menos de la mitad.

Si analizamos las etapas de almacenamiento, y recordamos que el bus de memoria del PowerPC es de 128 bits, veremos que las operaciones de carga pueden realizarse en un único ciclo de memoria, mientras que en un procesador de 32 bits con ancho de 64 necesitaremos un par de ciclos, y teniendo en cuenta que la memoria es, hoy en día, una de los cuellos de botella del procesador, reducir el número de accesos es vital.

Los nuevos Mac de 64 bits

Después de todo lo anterior, estamos en condiciones de entender mejor este diagrama, correspondiente a la nueva arquitectura del iMac G5:

juandeMac64bits.gif
Clic para ampliar

En este diagrama observamos diferentes buses, a diferentes velocidades de reloj. Si el PowerPC 970 del iMac fuese el de la configuración más rápida disponible, a 1,8GHz, el bus de comunicación con el controlador de memoria U3 sería de un tercio, o sea 600MHz. Este controlador accede a la memoria de 128 en 128 bits cuando la memoria está pareada, y de 64 en 64 bits cuando no lo está (de ahí que un iMac G5 con 512MB pueda ser más rápido a veces que si estuviera equipado con 256 + 512 = 768MB, proporcionados por módulos diferentes).

Los dispositivos de entrada y salida son mucho más lentos, y de ahí que todas las conexiones se realicen mediante un bus HyperTransport de menor velocidad, y de 8 en 8 bits —para abaratar costes en el diseño de la placa (menos bits de ancho = menos líneas = menos tamaño)—.

Comparemos esto con un Power Macintosh G5 de última generación:

juandeMacnuevo.jpg
Clic para ampliar

Podemos ver que la diferencia se centra fundamentalmente en las siguientes características:

a) Posibilidad de doble procesador, con buses independientes por procesador

b) Conexión HyperTransport de 16-bit a 4.8GBps con el puente PCI-X

c) Conexión HyperTransport de 8-bits a 1.6GBps con el resto de controladores de dispositivos.

Otras optimizaciones del G5

¿Qué otras cosas hacen que un G5 sea mucho más rápido que un G4? Veamos su arquitectura:

juandeoptimizacionesG5.jpg
Clic para ampliar

Ya hemos visto que el sistema de memoria es uno de los cuellos de botella de cualquier procesador actual, capaz de recoger y ejecutar más instrucciones por ciclo de reloj de las que puede obtener de la memoria. Por eso es tan importante tener un acceso directo a la misma, y que las instrucciones no se vean enlentecidas al escribir los resultados.

Para ello, se utiliza:

Caché L1 de datos e instrucciones a la velocidad del procesador; 64KB para instrucciones, 32KB para datos, a 2,5GHz y con ancho de 256 bits.

Caché L2 unificada, a la velocidad del bus frontal: 512KB a 1,25GHz.

Finalmente, los datos se recuperan de la memoria a 400MHz (suponiendo 0 estados de espera y latencia 0), a 128 bits de ancho, o 256 en caso de unidades con doble procesador. ¡Un G5 es más rápido en el acceso sostenido a RAM que un G4 en el acceso sostenido a la caché L1! Eso sí, un acceso no previsto a la RAM —primer acceso de una serie— tiene una penalización debido a la latencia de la memoria…

En un movimiento de lectura, se lee no sólo la posición actual, sino las cuatro posiciones siguientes. Normalmente, esto supone multiplicar por cuatro el rendimiento del subsistema de memoria, a cambio de posibles fallos si sólo se quería leer o escribir en una única posición individual.

¿Qué puedo hacer yo con aplicaciones de 64 bits?

Buena pregunta 😉 Veamos si tenemos una buena respuesta…

En primer lugar, obtenemos TODAS las optimizaciones del procesador a la hora de mejorar la entrega de instrucciones, incluso si una aplicación está únicamente optimizada para el G4. Por ejemplo, utilizando instrucciones Altivec/Vector Engine, el G5 es capaz de aparear la ejecución de esas instrucciones junto con muchas otras (dispone de 5 ranuras de compleción de instrucciones, frente a sólo 4 para el G4, y existen muchas menos dependencias entre instrucciones al disponer de más unidades de ejecución).

Mac OS X Panther presenta además un conjunto especial de funciones que permiten que ciertas operaciones se realicen utilizando instrucciones de 64 bits en lugar de instrucciones de 32 bits, cuando se detecta el nuevo procesador.

En segundo lugar, la capacidad de disponer de más memoria para nuestras aplicaciones: en Panther, es posible disponer de hasta 4GB por aplicación, hasta ocupar el total de 8GB. En Tiger, el sistema operativo puede repartir la memoria del sistema como crea conveniente, y el espacio virtual de memoria es de 64 bits, es decir, todo el disco duro si hiciera falta 😉

En tercero, la unidad de enteros de 64 bits permite hacer con la unidad de enteros muchas operaciones de cálculo aproximado antes sólo posibles en la unidad de coma flotante, de modo que se aceleran muchas transformaciones.

En cuarto lugar, el acceso de 128 bits a la memoria permite aumentar la velocidad de todas las aplicaciones que realicen un gran movimiento de datos…

En resumen, no existen aplicaciones nuevas para el PowerPC 970, pero sí existe un nuevo nivel de rendimiento, que permite en algunos casos duplicar al actual a la misma velocidad de reloj, y que puede permitir cálculos intensivos —Core Video— sin penalizar el rendimiento del procesador. Así mismo, la capacidad de mantener el máximo de elementos en RAM, en lugar de utilizar memoria virtual, permite la aceleración de gran número de tareas asociadas al tratamiento masivo de información, ya sean bases de datos, procesamiento de imágenes, de audio, o de vídeo.

Juan de Dios Santander Vela, Ingeniero en Electrónica

Referencias

Understanding 64-bit PowerPC architecture

Diseño de CPUs (CPU Design)

Thomas Scherrer Z800-Family Official Support Page

Devi Ahilya Vishwavidyalaya University, Online Lectures

Hardware: iMac G5 Developer Note

Hardware: Power Mac G5 Developer Note

Apple: PowerPC G5 Whitepaper

17 Comments

  1. Anónimo

    Los articulos de Juan me gustan bastante. No me gustan los “polemicos” y los q se meten con Microsoft y demas pq aportan muy poco.

    Los ultimos articulos de Juan me han parecido muy interesantes y me gustaria q se mantuviese esta linea.

    Los articulos de Applescript me han interesado, pero creo q deberia de haber un enlace a los articulos anteriores desde la pagina principal. Tal vez seria una idea el hacer “cursos” para gente q empieza con el Mac para tenerlos en un archivo on-line.

  2. Anónimo

    Eiiiiinnnnn????
    Creo que esta parrafada no apta para mortales, se podia haber resumido en un:
    “el G5 es mu gueno que lo digo yo questudiao˝. Vamos, vamos… todavia estoy contandome los dedos a ver si los tengo todos… 😀

  3. Anónimo

    “queremos sumar dos números de dos cifras….53 y 29. Para hacer la operación, en primer lugar utilizamos la parte menos significativa de ambos números (3 y 8, en este caso), y los sumamos. El resultado es 12”

    Si lo dice Juande es cierto, os lo juro! 😉

    Excelente artículo.

  4. Anónimo

    “Expresado de forma matemática, el valor máximo que se pueden conseguir con n cifras decimales es 10^n – 1 (10 elevado a n menos 1, o lo que es lo mismo 10*10*…*10 n veces menos 1).”

    Creo que te has equivocado, pues si tuvieramos una cifra, entonces tendriamos 10^0 = 1 , lo cual no es verdad, por lo tanto debe ser 10^n

Deja una respuesta