2011-09-30 8 views
7

gcc cuenta con likely/unlikely hints que ayudan al compilador a generar código de máquina con una mejor predicción de bifurcación.¿Hay algún resultado de prueba de rendimiento para el uso de sugerencias probables/improbables?

¿Hay alguna información sobre cómo el uso correcto o la falta de uso de esas sugerencias afecta el rendimiento del código real en algunos sistemas reales?

+1

No creo que haya métricas fuertes, ya que es una micro-optimización, y dependerá de la frecuencia con la sugerencia correcta o no, del tamaño del código binario en los bloques 'if/else' y tal vez incluso la fase de la luna –

+0

Esencialmente esto se asigna al predictor de bifurcación de la CPU; el tamaño del código binario es irrelevante. – MSalters

+0

Para el rendimiento no tengo puntos de referencia, pero una cosa que puedo decir es que el ensamblador que es producido por gcc con tales pistas es mucho más claro. –

Respuesta

3

La pregunta es diferente, pero Peter Cordes's answer en this question da una pista clara;). Las CPU modernas ignoran sugerencias estáticas y usan predicción dinámica de bifurcación.

+1

Parece que no se trata solo de sugerencias: http://hyhtech.blogspot.com/2008/08/likelyunlikely-macros-in-linux-kernel.html: afecta a qué código de sucursal se coloca en la ruta que está predeterminada cuando La CPU ejecuta el código por primera vez y no tiene idea de cómo se comporta ese código aún. – sharptooth

0

No conozco ningún análisis exhaustivo de tales consejos particulares. En cualquier caso, sería extremadamente específico de la CPU. En general, si está seguro de la probabilidad (por ejemplo,> 90%), entonces probablemente valga la pena agregar tales anotaciones, aunque las mejoras variarán mucho con el caso de uso específico.

Las CPU de escritorio modernas tienden a tener una predicción de bifurcación muy buena. Si su código está en una ruta caliente de todos modos, el predictor dinámico de bifurcación se dará cuenta rápidamente de que la bifurcación está sesgada por sí misma. Tales sugerencias son principalmente útiles para ayudar al predictor estático que se activa si no hay información dinámica disponible.

En x86, el predictor estático predice que las ramas hacia adelante no se tomarán y se tomarán ramas hacia atrás (ya que generalmente indican bucles). El compilador, por lo tanto, ajustará el diseño del código estático para que coincida con las predicciones. (Esto también puede ayudar a colocar la ruta caliente en líneas de caché adyacentes, lo que puede ayudar aún más.)

En PPC, algunas instrucciones de salto tienen un poco para predecir su probabilidad. No sé si el compilador también reorganizará el código.

No sé cómo las CPU ARM predicen las ramas. Como dispositivo de baja potencia, puede tener una predicción de bifurcación menos sofisticada y la predicción estática podría tener más impacto.

Cuestiones relacionadas