Qué el aumento de profundidad de la tubería no siempre significa que el aumento del rendimiento?

StackOverflow https://stackoverflow.com/questions/2597189

  •  25-09-2019
  •  | 
  •  

Pregunta

Esta es tal vez más una cuestión de discusión, pero pensé stackoverflow podría ser el lugar adecuado para hacerla. Estoy estudiando el concepto de segmentación de instrucciones. Se me ha enseñado que la instrucción de una tubería de producción se aumenta una vez que el número de etapas de canalización se incrementa, pero en algunos casos, el rendimiento no se puede cambiar. ¿En qué condiciones, qué sucede esto? Pienso estancamiento y la ramificación podría ser la respuesta a la pregunta, pero me pregunto si estoy perdiendo algo fundamental.

¿Fue útil?

Solución

El largo puede ser frenada por otras instrucciones cuando la espera de un resultado o de fallos de caché. Pipelining por sí mismo no garantiza que las operaciones son totalmente independientes. Aquí hay una gran presentación sobre las complejidades de la arquitectura x86 de Intel / AMD: 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 mencionado ejecución fuera de orden para uno, y tiene registros de sombra no expuestas por el modelo de programador (más de 8 registros en x86), y también tiene la predicción de saltos.

Otros consejos

De acuerdo. Los mayores problemas son puestos (a la espera de los resultados de las instrucciones anteriores), y la predicción de saltos incorrectos. Si su tubería es de 20 etapas de profundidad, y se cala a la espera de los resultados de una condición u operación, que va a esperar más tiempo que si su tubería estaba a sólo 5 etapas. Si usted predice la rama equivocada, usted tiene que limpiar 20 Instrucciones fuera de la tubería, en contraposición a 5.

supongo que presumiblemente podría tener una tubería profunda en múltiples etapas están intentando acceder al mismo hardware (ALU, etc), lo que provocaría un impacto en el rendimiento, aunque es de esperar que tirar de suficientes unidades adicionales para apoyar cada etapa.

paralelismo a nivel de instrucción tiene rendimiento decreciente. En particular, las dependencias de datos entre instrucciones de determinar 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 ser conocida por el tiempo que el cálculo de la línea 10 comienza. envío de datos mitiga este problema, pero ... sólo hasta el punto en que los datos se conoce.

También podría pensar que el aumento de la canalización más allá de la cantidad de tiempo que la instrucción más larga en una serie tomaría para ejecutar incapaces de causar un aumento en el rendimiento. Creo que se cale y ramificación son las cuestiones fundamentales sin embargo.

Definitivamente atasca / burbujas en largas tuberías causa una enorme pérdida en el rendimiento. Y, por supuesto, el más largo de la tubería más ciclos de reloj se desperdician.

He intentado durante mucho tiempo para pensar en otros escenarios en los oleoductos más largos podrían causar una pérdida de rendimiento, pero todo vuelve a los puestos. (Y el número de unidades de ejecución y esquemas de emisión, pero los que no tienen mucho que ver con la longitud de la tubería.)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top