miércoles, 4 de mayo de 2011

Cual es la relación entre la velocidad del reloj de los procesadores y el rendimiento?


Alguien hizo la pregunta en Arstechnica, y hubo respuesta (que aquí le traemos). Hay  connotaciones un poco mas sutiles del asunto, y están en las diferencias mas o menos notables de velocidades de ejecución de determinadas aplicaciones en sistemas mas rápidos (que a veces se quedan levitando y termina uno razonando que para la maquinota que tiene las cosas deberían ir mas rápidamente) pero eso ya es harina de otro costal, hay mas factores que van desde la arquitectura (32/64) hasta los sistemas operativos. En fin, aquí tienen una explicación bastante clara de una parte del asunto. Al final hay dos enlaces a artículos relativos, van a ser procesados ....... paciencia ;-) 

Pregunta: El lanzamiento de la micro arquitectura Sandy Bridge de Intel acaba de llevar su línea de CPUs de escritorio hasta los 3.8GHz, pero recuerdo que el Pentium 4 llegó a 3.8GHz, antes de ser cancelado. Entonces ¿por qué es que Sandy Bridge llega ahora a los niveles de velocidad de reloj que el procesador Pentium 4 alcanzó hace años? Y ¿cómo es que Sandy Bridge se las arregla para superar a los antiguos Pentium 4, a pesar de que tiene velocidades de reloj más bajas?
La relación entre la velocidad de reloj y el rendimiento no es hoy tan nítida como solía, y de todas maneras nunca fue tan simple.  Para entender por qué diferentes CPUs a diferentes velocidades de reloj se desempeñan de maneras diferentes, primero veremos cómo la CPU procesa las instrucciones. 
Una CPU procesa las instrucciones en forma de una cadena de montaje, con instrucciones diferentes que existen en las diferentes etapas de realización a medida que avanzan en la línea. Por ejemplo, cada instrucción en el Pentium original pasa a través de las siguientes cinco etapas de segmentación (pipeline en el original vean la referencia, usaremos el término tubería indistintamente ndt):
  • Prefetch/Fetch: Las instrucciones se obtienen de la caché de instrucciones y son alineadas para ser decodificadas.
  • Decode1: Las instrucciones son decodificadas al formato de instrucciones internas del Pentium. La predicción de las bifurcaciones (branch) también se lleva a cabo en esta etapa.
  • Decode2: Igual que el anterior. Además, el cálculos de las direcciones se llevará a cabo en esta etapa.
  • Ejecución: El hardware de enteros ejecuta la instrucción.
  • Write-back: Los resultados de los cálculos se vuelven a escribir el archivo del registro.
Una instrucción entra en segmentación en la etapa 1, y la abandona en la etapa 5. Dado que el flujo de instrucciones que fluye en la parte delantera de la CPU es una secuencia ordenada de instrucciones que deben ser ejecutadas una después de otra, tiene sentido introducirlas en segmentación una después de la otra. Cuando tubería está llena, entonces hay una instrucción en cada etapa.
Cada etapa en la segmentación se completa en un ciclo de reloj, por lo que cuanto menor sea el ciclo de reloj, más instrucciones por segundo, la CPU puede procesar a través de su tubería. Por eso, en general, una velocidad de reloj más rápida significa más instrucciones por segundo y por tanto un rendimiento más alto.

La mayoría de los procesadores modernos, sin embargo, dividen su segmentación en muchas etapas mas pequeñas que el Pentium. Las iteraciones posteriores del Pentium 4 tenían alrededor de 21 etapas en sus tuberías. Esta tubería de 21 etapas ejecutaba los mismos pasos básicos (con algunas adiciones importantes para la reordenación de las instrucciones) que la tubería del Pentium anterior, pero dividía cada etapa en muchas pequeñas etapas. Debido a que cada etapa en la tubería era más pequeña y tomaba menos tiempo, los ciclos de reloj del Pentium 4 eran mucho más cortos y sus velocidades de reloj muy superiores.
En pocas palabras, al Pentium 4 le tomaba muchos mas ciclos de reloj hacer la misma cantidad de trabajo que el Pentium original, por lo que su velocidad de reloj era mucho más alta para la cantidad equivalente de trabajo. Esta es una de las razones principales por la que no tiene mucho sentido comparar velocidades de reloj entre las distintas arquitecturas y familias de procesadores, la cantidad de trabajo realizado por ciclo de reloj es diferente para cada arquitectura, por lo que la relación entre el rendimiento y la velocidad de reloj (medido en instrucciones por segundo) es diferente.

Ahora, la relación velocidad de reloj-rendimiento es estable dentro de la misma familia de procesadores, por lo que un CPU Core i5 de 3,4 GHz superará un CPU Core i5 a 3.1GHz, en igualdad de condiciones.

Una mirada más cercana: demoras, vaciados, y longitud de tubería. 
Los lectores astutos que razonaron lo anterior podrían llegar a la conclusión de que un Pentium a 4 3.8GHz debe, en promedio, todavía funcionar similarmente, que un Sandy Bridge a 3.8GHz, aunque la tubería del primero es más larga. (¿por qué?) Porque si ambas tuberías están llenas, el número de instrucciones por segundo que saldrá de cada una es la misma. Piense en esto: si una empresa tiene en funcionamiento una línea de montaje de 21 etapas a razón de una etapa por segundo, y otra una línea de 12 etapas a razón de una etapa por segundo, entonces las dos siguen produciendo un producto terminado cada segundo cuando ambas lineas están llenas.

Pero nótese la última parte de la frase anterior: "cuando ambas lineas están llenas" Cada vez que el procesador cambia de hilos o equivoca la predicción de una bifurcación, tiene que vaciar la tubería y volver a llenarla. Y a veces, las instrucciones quedan estancadas en la tubería durante varios ciclos, dejando las etapas posteriores inactivas, sin nada que hacer. Estos vaciados y demoras son una razón clave por la que, para una velocidad de reloj dada, es mejor tener una tubería más corta que una más rápida - a la tubería más corta le toma menos tiempo llenarse después de un vaciado, y empieza mas rápido a completar las instrucciones de nuevo después de una parada.
A 3.8GHz, la tubería más corta del Core i5, que hace mas trabajos por etapa, puede vencer la tubería mas larga del Pentium 4, porque en cualquier momento, aun cuando la tubería se vacíe parcialmente, el Core i5 la puede rellenar y recuperar mucho más rápidamente. El resultado final es que, en promedio, la tubería del Core i5 queda llena por más tiempo que la del Pentium 4, lo que hace al Core i5 más rápido.

Por supuesto, una tubería más corta no es la única razón por la que la del Core i5 se encuentra llena con más frecuencia que la del Pentium 4. Otras razones incluyen un predictor de bifurcaciones superior, que mantiene los errores de predicciones que disminuyen el rendimiento al mínimo, y caches más grandes, que mantienen la tubería del Core i5 alimentada con instrucciones de acceso instantáneo.

Resumiéndolo todo.
Al comparar velocidades de reloj de procesadores dentro de la misma familia, la velocidad de reloj es una buena guía para el rendimiento, ya una velocidad de reloj más alta significa más instrucciones completadas por segundo.
Sin embargo, al comparar velocidades de reloj de procesadores de diferentes diseños, generalmente es como comparar manzanas con naranjas. Para dos CPUs con la misma velocidad de reloj, una tubería más corta tiene ventaja porque permanece llena con más frecuencia. Para dos CPUs con igual profundidad de tubería, pero diferentes velocidades de reloj, la velocidad de reloj más alta le da una ventaja. Para dos CPUs con diferentes velocidades, dependerá entonces de la profundidad de la tubería y otros factores.

En última instancia, la relación entre la velocidad de reloj y el rendimiento es compleja, si usted desea explorar este asunto más a fondo, debe revisar los dos artículos enlazados a continuación.

Material de lectura adicional

Pipelining: Generalidades Parte 1