2010-04-08 20 views
7

Esto es quizás más una cuestión de debate, pero pensé que stackoverflow podría ser el lugar adecuado para preguntarlo. Estoy estudiando el concepto de canalización de instrucciones. Me han enseñado que el rendimiento de las instrucciones de un oleoducto aumenta una vez que se aumenta el número de etapas del oleoducto, pero en algunos casos, el rendimiento podría no cambiar. ¿En qué condiciones sucede esto? Estoy pensando en el estancamiento y la ramificación podría ser la respuesta a la pregunta, pero me pregunto si me estoy perdiendo algo crucial.¿Por qué una mayor profundidad de la tubería no siempre significa un mayor rendimiento?

+0

Gracias por las respuestas. Solo para su información, otra cosa que me viene a la mente es que incluso si aumentamos las etapas del pipeline, con la esperanza de romper la lógica de etapa de pipeline original en subredes más pequeñas, una instrucción podría no propagarse a través de estas redes más pequeñas porque su forma más simple de jerarquía explicado en términos de la lógica de etapa original, por lo que esto no afectaría el rendimiento. – user246392

Respuesta

4

El todo se puede estancar por otras instrucciones al esperar un resultado, o en fallas de caché. Pipelining no garantiza que las operaciones sean totalmente independientes. Aquí es una gran presentación acerca de las complejidades de la arquitectura Intel x86/AMD arquitectura: http://www.infoq.com/presentations/click-crash-course-modern-hardware

Se explica cosas como esta en gran detalle, y cubre algunas soluciones sobre cómo mejorar aún más el rendimiento y ocultar la latencia. JustJeff mencionó la ejecución fuera de orden para uno, y tiene registros paralelos no expuestos por el modelo del programador (más de 8 registros en x86), y también tiene predicción de bifurcación.

0

También creo que aumentar la canalización más allá del tiempo que llevaría ejecutar la instrucción más larga de una serie no provocaría un aumento en el rendimiento. Sin embargo, creo que el estancamiento y la ramificación son los problemas fundamentales.

0

Definitivamente las paradas/burbujas en las tuberías largas causan una gran pérdida en el rendimiento. Y, por supuesto, cuanto más larga es la tubería, más ciclos de reloj se desperdician.

Intenté durante mucho tiempo pensar en otros escenarios en los que las tuberías más largas podrían causar una pérdida de rendimiento, pero todo vuelve a los puestos. (Y número de unidades de ejecución y esquemas de problema, pero no tienen mucho que ver con la longitud de la tubería).

2

De acuerdo. Los mayores problemas son los puestos (a la espera de los resultados de las instrucciones anteriores) y la predicción de bifurcación incorrecta. Si su tubería tiene 20 etapas de profundidad, y se para en espera de los resultados de una condición u operación, esperará más tiempo que si su tubería fuera solo de 5 etapas. Si predice la bifurcación incorrecta, debe eliminar 20 instrucciones de la tubería, en oposición a 5.

Supongo que podría tener una tubería profunda donde varias etapas intentan acceder al mismo hardware (ALU, etc.), lo que causaría un golpe de rendimiento, aunque es de esperar que arrojes suficientes unidades adicionales para apoyar cada etapa.

+1

Eso no son 20 instrucciones, sino instrucciones de 20 ciclos. En una CPU fuertemente superescalar, eso puede ser MUCHO más. – slacker

1

El paralelismo del nivel de instrucción tiene rendimientos decrecientes. En particular, las dependencias de datos entre instrucciones determinan el posible paralelismo.

Considere el caso de Leer después de escribir (conocido como RAW en los libros de texto).

En la sintaxis donde el primer operando obtiene el resultado, considere este ejemplo.

10: add r1, r2, r3 
20: add r1, r1, r1 

El resultado de la línea 10 debe conocerse en el momento en que comienza el cómputo de la línea 10. El reenvío de datos mitiga este problema, pero ... solo hasta el punto en que se conocen los datos.

Cuestiones relacionadas