es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Intel JCC Erratum – ¿cuál es el efecto de los prefijos utilizados para la mitigación?

Intel recomienda el uso de prefijos de instrucción para mitigar las consecuencias de rendimiento del Erratum JCC.

MSVC, si se compila con /QIntel-jcc-erratum, sigue la recomendación e inserta instrucciones con prefijos, como se muestra a continuación:

3E 3E 3E 3E 3E 3E 3E 3E 3E 48 8B C8   mov rcx,rax ; con prefijos redundantes 3E

Según dicen, MSVC recurre a NOPs cuando no son posibles los prefijos.

Clang tiene la opción -mbranches-within-32B-boundaries para esto, y prefiere NOPs, ya sean de varios bytes o no (https://godbolt.org/z/399nc5Msq, fíjate en xchg ax, ax).

¿Cuáles son las consecuencias de los prefijos 3E, específicamente?
– ¿Por qué Intel recomienda esto en lugar de los NOPs de varios bytes?
– ¿Qué consecuencias tiene en las CPUs no afectadas?
– Según reportes, un programa se ejecuta más rápido con /QIntel-jcc-erratum en los procesadores AMD, ¿cuáles podrían ser las posibles explicaciones?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Consecuencias de los prefijos 3E

    ¿Por qué Intel recomienda esto y no NOPs de varios bytes?

    Intel recomienda usar prefijos de instrucción para mitigar las consecuencias de JCC Erratum porque algunos CPUs afectados pueden predecir incorrectamente el destino de una instrucción de transferencia de control de retorno cercana después de un salto condicional tomado con un límite de 16 bytes. Esta predicción incorrecta puede resultar en una penalización de rendimiento debido a una pausa en el pipeline o a una ruta de ejecución de código incorrecta.

    Los prefijos de instrucción, como el prefijo 3E, se pueden utilizar para insertar una operación redundante entre el salto condicional y la instrucción de transferencia de control posterior. Esta operación puede servir como marcador de la instrucción predicha, evitando así la pausa en el pipeline o la ruta de ejecución de código incorrecta.

    Por otro lado, los NOPs de varios bytes pueden no ser efectivos para mitigar JCC Erratum. Esto se debe a que no tienen el mismo efecto que los prefijos de instrucción para evitar pausas en el pipeline o rutas de ejecución de código incorrectas.

    ¿Cuáles son las consecuencias para CPUs no afectadas?

    Las CPUs no afectadas no experimentarán ninguna consecuencia al usar prefijos de instrucción. Sin embargo, el uso de prefijos de instrucción puede resultar en una ligera disminución del rendimiento debido al aumento del tamaño del código y al tiempo de ejecución adicional requerido para procesar estos prefijos.

    Se informa que un programa se ejecuta más rápido con /QIntel-jcc-erratum en AMD, ¿qué posibles explicaciones podría haber?

    El hecho de que un programa se ejecute más rápido con /QIntel-jcc-erratum en AMD podría deberse a varias posibles explicaciones. Una explicación podría ser que el CPU AMD en cuestión tiene una deficiencia similar que se remedia mediante el uso de prefijos de instrucción.

    Otra posible explicación podría ser que el programa en cuestión tiene un patrón de código particular que se beneficia del uso de prefijos de instrucción, independientemente de la arquitectura del CPU subyacente. En este caso, el uso de prefijos de instrucción podría proporcionar un aumento de rendimiento tanto en CPUs afectadas como no afectadas.

    También es posible que la mejora de rendimiento observada se deba a otros factores, como diferencias en las optimizaciones del compilador o variaciones en las configuraciones del sistema. Por lo tanto, puede ser necesario realizar una investigación adicional para determinar la causa exacta de la mejora de rendimiento.

Comments are closed.