tl; dr
Las tuberías más cortas significan velocidades de reloj más rápidas, pero pueden reducir el rendimiento. Además, vea las respuestas # 2 y 3 en la parte inferior (son cortas, lo prometo).
Versión más larga:
Hay algunas cosas a considerar aquí:
- No todas las instrucciones toman el mismo tiempo.
- No todas las instrucciones dependen de lo que se hizo inmediatamente (o incluso de diez o veinte) instrucciones.
Una tubería muy simplificada (lo que sucede en los chips Intel modernos es más que complejo) tiene varias etapas:
Recuperar -> Decodificar -> Acceso a memoria -> Ejecutar -> Reescritura -> Actualización de contador de programa
En cada uno -> hay un costo de tiempo en el que se incurre. Además, en cada tic (ciclo de reloj), todo se mueve de una etapa a la siguiente, por lo que su etapa más lenta se convierte en la velocidad de TODAS las etapas (realmente vale la pena que tengan la mayor longitud posible).
Digamos que tiene 5 instrucciones y desea ejecutarlas (foto tomada de wikipedia, aquí no se realiza la actualización de la PC). Se vería así:
Aunque cada instrucción tarda 5 ciclos de reloj en completarse, una instrucción terminada sale de la tubería cada ciclo. Si el tiempo que toma cada etapa es de 40 ns, y 15 ns para los bits intermedios (usando mi tubería de seis etapas anterior), tomará 40 * 6 + 5 * 15 = 315 ns para obtener la primera instrucción.
Por el contrario, si eliminara la tubería por completo (pero mantuviera todo lo demás igual), tomaría solo 240 ns para obtener la primera instrucción. (Esta diferencia en la velocidad para obtener la "primera" instrucción se llama latencia. Generalmente es menos importante que el rendimiento, que es el número de instrucciones por segundo).
Sin embargo, la verdadera diferencia es que en el ejemplo canalizado, recibo una nueva instrucción (después de la primera) cada 60 ns. En el no canalizado, se necesitan 240 cada vez. Esto muestra que las tuberías son buenas para mejorar el rendimiento.
Dando un paso más allá, parecería que en la etapa de acceso a la memoria, necesitaré una unidad adicional (para hacer cálculos de direcciones). Eso significa que si hay una instrucción que no usa la etapa mem ese ciclo, entonces puedo hacer otra adición. Por lo tanto, puedo hacer dos etapas de ejecución (con una en la etapa de acceso a la memoria) en un procesador en un solo tic (la programación es una pesadilla, pero no vayamos allí. Además, la etapa de actualización de la PC también necesitará una unidad adicional en el caso de un salto, por lo que puedo hacer tres estados de ejecución de suma en una marca). Al tener una tubería, se puede diseñar de modo que dos (o más) instrucciones puedan usar diferentes etapas (o etapas de salto, etc.), ahorrando un tiempo valioso.
Tenga en cuenta que para hacer esto, los procesadores hacen mucha "magia" ( ejecución fuera de orden , predicción de ramificaciones y mucho más), pero esto permite que varias instrucciones salgan más rápido que sin una tubería (tenga en cuenta que las tuberías también mucho tiempo son muy difíciles de administrar e incurren en un costo más alto simplemente esperando entre etapas La otra cara es que si hace que la tubería sea demasiado larga, puede obtener una velocidad de reloj loca, pero pierde muchos de los beneficios originales (de tener el mismo tipo de lógica que puede existir en varios lugares y usarse al mismo tiempo) )
Respuesta # 2:
Los procesadores SIMD (instrucción única de datos múltiples) (como la mayoría de las GPU) hacen mucho trabajo en muchos bits de información, pero les lleva más tiempo hacerlo. La lectura de todos los valores lleva más tiempo (significa un reloj más lento, aunque esto se compensa al tener un bus mucho más ancho hasta cierto punto), pero puede obtener muchas más instrucciones a la vez (instrucciones más efectivas por ciclo).
Respuesta # 3:
Debido a que puede "hacer trampa" y alargar artificialmente el conteo del ciclo para que pueda hacer dos instrucciones en cada ciclo (solo reduzca a la mitad la velocidad del reloj). También es posible hacer algo solo cada dos tics en lugar de uno (dando una velocidad de reloj 2x, pero no cambiar las instrucciones por un segundo).