En el artículo anterior se analizaron las causas que han llevado a Apple a cambiar de suministrador de microprocesadores, y de paso, de arquitectura. En este artículo, se va a discutir algunas de las características del Pentium-M, un microprocesador de Intel que podría acabar en varios modelos Mac. Para ello, antes hablaremos un poco de una técnica muy utilizada en los microprocesadores actuales: la segmentación.

Filosofía de Diseño del Pentium-M

El Pentium-M ha sido diseñado desde el principio con el único propósito de obtener potencia razonable con un consumo muy pequeño. Este principio guía el diseño de cada una de las partes del micro, y es la causa de cada una de las decisiones tomadas por los ingenieros de Intel.
Partiendo de esta idea, hay una serie de principios básicos que se deducen inmediatamente:

  • Si queremos que el chip consuma poco, debe ir a frecuencias de reloj moderadas, porque las altas frecuencias de reloj contribuyen a disparar el consumo (por tanto, podemos olvidarnos de los casi 4 GHz del Pentium4).
  • Al mismo tiempo, debemos procurar fabricar el chip en el mejor proceso de fabricación disponible, porque en general, las mejoras en los procesos de fabricación contribuyen a que los chips consuman menos.
  • Debemos procurar que el chip ejecute código lo más eficientemente posible. Dicho de otro modo, la ejecución de cada tipo de instrucción debe requerir la mínima cantidad de potencia posible.

El ahorro de energía es la idea fundamental de diseño del Pentium-M.

La segmentación y sus problemas

El final de los años 90 trajo al mundo de la informática los llamados microprocesadores supersegmentados, Estos microprocesadores se caracterizan por utilizar pipelines muy segmentadas, para tratar de alcanzar frecuencias lo más altas posibles.

Desde hace ya bastantes años, los microprocesadores no ejecutan instrucciones “de una vez”, sino que dividen el proceso de ejecución en varias partes, que son ejecutadas una detrás de otra. Para ilustrar esta idea, se me ocurre el ejemplo de una manzana. Generalmente, cuando uno va a comerse una manzana, suele hacer varias cosas antes: primero, se suele lavar la fruta, luego, se suele pelar la piel, luego se suele dividir en trozos pequeños, y finalmente esos trozos se comen.

Supongamos ahora que una persona sola pretende comerse esa manzana, y supongamos que tarda un minuto en realizar cada uno de los pasos anteriores. Es evidente que en total tardaría cuatro minutos en comérsela, y que, además, sería capaz de comer una manzana cada cuatro minutos.

Vamos a suponer que tenemos, en vez de una sola persona, cuatro personas, cada una de las cuales está encargada de una función. Vamos a suponer que nuestro objetivo es comernos el mayor número de manzanas posible. Para ello, distribuimos el trabajo entre las cuatro personas: una de ellas sólo lavará manzanas, otra las pelará, otra las troceará, y la última finalmente se las comerá.

Pensemos que tenemos una bolsa entera de manzanas, y que comenzamos a realizar nuestro trabajo. La primera manzana tarda, al igual que antes, cuatro minutos en ser comida, y esto es igual para todas las demás. Sin embargo, a partir del cuarto minuto, cada minuto podemos estar comiendo una manzana. No hemos mejorado el tiempo de “proceso” de cada manzana, pero sí hemos mejorado considerablemente el número medio de manzanas consumidas por minuto.
 Diagrama_manzanas.jpg
Este proceso es análogo al proceso de pipelining que utilizan los microprocesadores modernos. Hemos conseguido mejorar la velocidad a la que somos capaces de comer manzanas dividiendo el proceso en partes, que pueden ejecutarse de forma independiente. Comer cada manzana, de forma individual, nos sigue costando 4 minutos, eso no varía. Sin embargo, ahora podemos comer una manzana cada minuto, mientras que antes comíamos una manzana cada cuatro minutos.

¿Qué pasaría si, en vez de dividir el proceso en cuatro partes, lo hubiéramos dividido en ocho partes diferentes (por ejemplo, lavar media manzana, lavar la otra media, pelar media manzana, pelar la otra media, …)? En ese caso, cada parte del proceso tardaría medio minuto en realizarse, y podríamos, a partir del minuto cuatro, comer una manzana entera cada medio minuto. Necesitaríamos, lógicamente, ocho personas, pero si somos capaces de conseguirlas, habríamos duplicado nuestra velocidad.

Con los microprocesadores pasa exactamente lo mismo. Cada ordenador posee una señal eléctrica periódica, que se denomina reloj. Esta señal sirve para “controlar” todo el sistema, para asegurarnos de que todas las partes funcionan sincronizadas entre sí. En nuestro caso, esta señal indica los instantes en los que cada instrucción “cambia de etapa”, es decir, pasa a la etapa siguiente de ejecución (en el caso de las manzanas sería el instante en el que una manzana pasa de estar siendo lavada a estar siendo pelada, por ejemplo).

Una forma inmediata que se nos puede ocurrir para aumentar la velocidad de ejecución es precisamente esa: dividir las etapas en subetapas, de forma que cada subetapa tarde mucho menos tiempo en ejecutarse. Haciendo esto, podríamos aumentar la frecuencia del reloj, dado que el margen de tiempo que necesita cada etapa es ahora mucho menor, y con ello, podríamos aumentar la cantidad media de instrucciones por segundo que ejecutamos, consiguiendo así mayor velocidad.

Sin embargo, no todo es tan sencillo. Existen dos posibles tipos de problemas: los problemas térmicos, y los problemas lógicos. Ambos problemas se ven potenciados de forma muy considerable si se elige una estrategia de supersegmentación.

Los problemas térmicos son los más sencillos de explicar. Cuando un chip se intenta utilizar a frecuencias demasiado elevadas, el consumo de energía y el calentamiento se disparan, de manera que incluso el chip puede llegarse a fundir, si no se refrigera adecuadamente.

Los problemas lógicos son más complicados. Puede suceder, por ejemplo, que en una etapa intermedia nos demos cuenta de que la instrucción que estamos intentando ejecutar es en realidad un salto, y que las instrucciones que deben venir a continuación no son las que estamos ejecutando. En el caso de las manzanas, podría suceder, si éstas estuvieran ordenadas de alguna manera, que estuviéramos ejecutando las manzanas 3 y 4 a continuación de la 2, y que descubriéramos que después de la 2 no viene la manzana 3, sino la 10. Esto nos obligaría a eliminar las manzanas anteriores a la 2 que estamos tratando de comer, y empezar desde el principio con la manzana 10. Esto implica una pérdida grande de rendimiento, que se acentúa además a medida que aumentan las etapas de ejecución (porque tendríamos que tirar más manzanas, o lo que es lo mismo, estaríamos perdiendo más tiempo). Nuestro ratio medio de “una manzana cada ciclo” se vería disminuido de forma muy considerable.
Diagrama_manzanas_3.jpg
Otro posible problema lógico es que las instrucciones dependan unas de otras, de forma que una instrucción no se pueda ejecutar hasta que alguna de las instrucciones anteriores ya haya sido ejecutada completamente. En este caso, una solución típica es simplemente parar el pipeline, esperar a que la primera instrucción termine, y después empezar a ejecutar la segunda instrucción. Esta solución también es muy peligrosa, puesto que hace que nuestro ratio de “una instrucción por ciclo” disminuya, y por consiguiente, también lo hace nuestro rendimiento real.

Los problemas lógicos son muy graves en un microprocesador supersegmentado, pero también afectan a los microprocesadores con pipelines relativamente cortas. Si se quiere lograr obtener un rendimiento cercano al máximo posible (que siempre es el equivalente a “una instrucción cada ciclo”), se deben utilizar técnicas como la reordenación de instrucciones para evitar la presencia de dependencias, o la ejecución especulativa para tratar de “adivinar” hacia dónde va a ir el salto, tratando de ejecutar las instrucciones que suponemos que deben ser ejecutadas.

En cualquier caso, los problemas derivados de la supersegmentación son especialmente graves en el caso de un chip para portátiles. Nuestro primer principio aconsejaba funcionar a frecuencias bajas, para consumir poco, y la supersegmentación pretende exactamente lo contrario. Nuestro tercer principio, nos obliga a tratar de ejecutar el código de forma lo más eficientemente posible, y la supersegmentación nos puede obligar a tirar el trabajo hecho en instrucciones que no nos interesaban, con el consiguiente desperdicio de tiempo, y sobre todo potencia.

Segmentaciones limitadas: primer cambio importante

La mayor diferencia entre el Pentium-M y el Pentium4 es el diseño del pipeline. Mientras el Pentium4 está diseñado para funcionar a frecuencias lo más altas posibles, el Pentium-M está diseñado para funcionar a la frecuencia más alta posible que permita un consumo razonable. Esta distinción es fundamental, porque implica un cambio muy importante en el diseño general del micro. El pipeline del Pentium-M es muy corto. Intel no ha publicado la cifra oficial, pero la mayoría de los artículos publicados estiman una cifra en torno a las 13-15 etapas. El Pentium4 Northwood (el que se vendía hasta hace dos años) tiene un pipeline de 20 etapas (sin tener en cuenta las 8 etapas de descodificación que en el Pentium4 no están en el pipeline principal, sino antes de la caché). El Pentium4 Prescott (que se empezó a vender el año pasado) tiene un pipeline de ¡¡¡31 etapas!!!.

El número de etapas del pipeline no es lo único importante. Además, el diseño electrónico del Pentium4 busca la mayor rapidez posible en la propagación de las señales, intentando disminuir el tiempo mínimo necesario para la ejecución de cada etapa (buscando como siempre subir frecuencias). El Pentium-M, por el contrario, trata de utilizar caminos que consuman lo mínimo posible. Esto hace que, aunque sea de forma extraoficial, el Pentium4 se pueda subir de frecuencias mucho más de lo que Intel ha decidido hacer (utilizando refrigeradores especiales hay gente que ha conseguido hacer funcionar Pentium4s a 5 GHz). El Pentium-M, por el contrario, no se puede subir demasiado.

La diferencia de segmentaciones produce diferencias de frecuencias: el Pentium-M actualmente alcanza los 2,13 GHz, mientras que el Pentium4 alcanza los 3,8 GHz. Por tanto, también produce diferencias de consumo eléctrico.  Un Pentium-M de gama alta (de los de 2,13 GHz), puede consumir en muchas situaciones menos de un tercio de lo que consume un Pentium4 de gama alta (a 3,4-3,8 GHz). Un Pentium-M LV(Low Voltage) puede consumir mucho menos todavía.

Por esto, el Pentium-M es perfectamente adecuado para ser utilizado en portátiles y diseños agresivos en tamaño (como por ejemplo el Mac mini). El Pentium4, por poner un ejemplo de chip supersegmentado, no lo es.

Lo interesante del Pentium-M es que, a pesar de poseer un pipeline mucho más corto que el del Pentium4, no renuncia a las técnicas de ejecución especulativa tan avanzadas de este último, e incluso utiliza técnicas más modernas en algunos casos, debido al tercer principio anterior, que propugna la ejecución de instrucciones de la forma más eficiente posible, tratando de no “desperdiciar trabajo”. Los índices de aciertos en la especulación de los saltos, por ejemplo, son muy similares en ambos chips. Sin embargo, en ese porcentaje de “especulaciones fallidas”, el Pentium-M se ve penalizado en mucha menor medida que el Pentium4, dado que el Pentium4 tiene un pipeline mucho más largo.

Como resumen de este artículo, se puede concluir que los chips supersegmentados han dejado de ser utilizables en portátiles, debido precisamente a sus propios principios de diseño, que les obligan a buscar frecuencias muy altas para obtener rendimiento. El Pentium-M, por el contrario, utiliza un pipeline lo suficientemente largo como para obtener frecuencias razonables, pero corto para los estándares actuales, buscando un equilibrio, una frecuencia que produzca un consumo muy ligero y rendimiento decente.


En el siguiente artículo, hablaré del subsistema de memoria del Pentium-M (que es dónde se concentran la mayoría de las innovaciones específicas de este procesador), y de otras características del chip, y haré una comparativa entre este micro y otros de su generación.

Referencias

  • Un artículo de ArsTechnica bastante interesante:

http://arstechnica.com/articles/paedia/cpu/pentium-m.ars/

  • Un par de artículos en AnandTech con benchmarcks:

http://www.anandtech.com/cpuchipsets/showdoc.aspx?i=2342
http://www.anandtech.com/cpuchipsets/showdoc.aspx?i=2382

  • Toda la documentación de Intel sobre el Pentium-M:

http://www.intel.com/design/mobile/pentiumm/documentation.htm