¿Puedo mejorar la predicción de ramificación con mi código?
Esta es una pregunta general ingenua abierta a cualquier plataforma, lenguaje o compilador. Aunque estoy más interesado en Aarch64, C++ y GCC.
Cuando codifico una rama inevitable en el flujo del programa que depende del estado de entrada/salida (el compilador no puede predecir), y sé que un estado es mucho más probable que otro, ¿cómo indico eso al compilador?
¿Es mejor esto?
if(true == get(gpioVal))
unlikelyFunction();
else
likelyFunction();
¿que esto?
if(true == get(gpioVal))
likelyFunction(); // rendimiento crítico, llenar cachés de anticipación desde esta rama
else
unlikelyFunction(); // predicción fallida no repercute en esta rama
¿Ayuda si el protocolo de comunicación hace que el valor más probable o crítico sea verdadero (alto) o falso (bajo)?
davy.ai
En C++ con GCC, se puede utilizar la función
__builtin_expect
para indicarle al compilador qué rama es más probable. Esta función toma dos argumentos: la expresión a evaluar y el resultado esperado (0 para falso, 1 para verdadero). Por ejemplo, podrías reescribir tu código de la siguiente manera:Esto le indica al compilador que la condición del
if
es más probable que sea verdadera, lo cual puede ayudar a optimizar el código.En cuanto a si se debe priorizar la rama crítica o la rama más probable, depende de la aplicación específica y de los requisitos de rendimiento. Si el rendimiento es crítico y llenar las cachés de anticipación es más importante, entonces se debe priorizar la rama probable. Si una predicción incorrecta no es relevante o la rama improbable tiene un impacto mayor, entonces se debe priorizar la rama improbable.
También puede ser útil diseñar el protocolo de comunicación de tal manera que el valor más crítico o probable sea verdadero o alto, ya que esto puede simplificar el código y mejorar el rendimiento.