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?
Respuesta
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.
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.
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).
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.
Eso no son 20 instrucciones, sino instrucciones de 20 ciclos. En una CPU fuertemente superescalar, eso puede ser MUCHO más. – slacker
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.
- 1. WPF VirtualizingStackPanel para un mayor rendimiento
- 2. Uso "mayor o igual" o simplemente "mayor que"
- 3. rendimiento del índice de mayor valor en una matriz
- 4. ¿Hay alguna diferencia de rendimiento entre mayor que y mayor que o igual?
- 5. ¿Cuál es el ceceo con mayor rendimiento en la JVM
- 6. Conmutación de fila mayor a columna mayor dimensiones
- 7. PostgreSQL desactivar una mayor producción
- 8. Mayor que menos, python
- 9. ¿Mayor profundidad de color para los iconos de la barra de herramientas de MFC?
- 10. Aplicaciones de la subcuencia de mayor aumento
- 11. JavaScript triplicar mayor que
- 12. ¿Qué instrucciones de CPU usan la mayor potencia?
- 13. ¿Qué significa la tubería vertical (|) en C++?
- 14. ExitCodes mayor que 255, posible?
- 15. Scala ~> (tilde mayor que)
- 16. ¿Qué significa que la "longitud del encabezado del perfil incrustado es mayor que la longitud de los datos"? error significa?
- 17. Problema con mayor insertar
- 18. Mayor calidad de gráficos JFreeChart
- 19. MySQL Query, seleccione mayor que
- 20. ¿Qué significa una tubería en una definición de clase?
- 21. Double.Epsilon por la igualdad, mayor que, menor que, menor que o igual a, mayor que o igual a
- 22. ¿000,000,000.00 es mayor que cero?
- 23. ¿Por qué los elementos hijo no pueden anular la opacidad del elemento primario con un valor mayor?
- 24. Comparación de Java Integer: mayor que
- 25. ¿Por qué debería comprobar si tengo un valor mayor que Int32.MaxValue?
- 26. Traducción al por mayor de C# a Objetivo C
- 27. ¿Por qué el texto se representa con un tamaño de fuente mayor en Opera?
- 28. ¿Por qué no funciona "set -P" después de una tubería?
- 29. Mayor que la comparación de cadenas en un Makefile
- 30. Robots.txt: permitir solo mayor SE
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