Algunos ajustes de compilador integrados hoy a la GNU Compiler Collection (GCC) están deshabilitando varias características de Advanced Performance Extensions (APX) para los próximos procesadores Intel Nova Lake y Diamond Rapids porque no están entregando el rendimiento esperado.

El ingeniero de compiladores de Intel Hongyu Wang subió dos parches al upstream con tuning adicional para los targets Nova Lake y Diamond Rapids ya existentes en este compilador open source de referencia. Lo interesante es que el tuning está orientado a evitar algunos atributos de la nueva funcionalidad APX en las partes que no rinden como se esperaba.

¿Qué es APX y por qué importa?

APX es un upgrade grande al conjunto de instrucciones x86, debutando con estos procesadores de próxima generación. Algunas áreas serán una ganancia clara, como doblar el número de registros de propósito general y varias instrucciones nuevas. Pero, dado el tuning del compilador subido hoy, parece que el roll-out inicial no es un slam dunk absoluto.

Parche 1: NDD en memoria deshabilitado en Nova Lake

El primer parche termina deshabilitando la forma de memoria de NDD del APX de Intel para Nova Lake. El commit explica:

"Los benchmarks muestran que la forma de memoria de las instrucciones NDD no es beneficiosa en NovaLake. Se agrega el tuning X86_TUNE_ENABLE_NDD_MEM (por defecto apagado) para deprorizar las alternativas NDD con operandos source de memoria vía el atributo preferred_for_speed. Para patrones NDD puros que tienen una sola alternativa con constraint rm, se divide en alternativas r,m y se aplica preferred_for_speed en la alternativa de memoria. Para patrones legacy con alternativas NDD, también se divide el constraint rm de NDD en alternativas separadas r y m, de modo que la deprorización apunte solo a la forma de memoria."

New Data Destination (NDD) es una característica nueva de Intel APX para actualizar algunas instrucciones aritméticas enteras de dos operandos a tres operandos. Pero, como se indicó, la forma de memoria de las instrucciones NDD "no es beneficiosa en Nova Lake" y por eso está siendo deshabilitada por defecto.

Parche 2: SETcc.ZU también desactivado en Nova Lake y Diamond Rapids

El otro parche de tuning de Intel subido hoy al Git de GCC deshabilita la generación de SETcc.ZU en Nova Lake y Diamond Rapids. La codificación SETcc.ZU es una instrucción mejorada por Intel APX en comparación con la SETcc legacy. SETZUcc está pensada para ser más eficiente que ejecutar SETcc seguido de un MOVZX.

Pero resulta que, según este parche, SETcc.ZU no provee beneficio en Nova Lake y Diamond Rapids:

"El rendimiento de microbenchmark en NovaLake/DiamondRapids no muestra beneficio de la codificación SETcc.ZU en estos cores. Se agrega X86_TUNE_DISABLE_SETZUCC para suprimir la generación de setzucc para DMR/NVL mientras se mantiene habilitada para otros targets capaces de APX."

¿Qué viene después?

Esos son los parches de tuning de Intel que entraron hoy al compilador GCC. Va a ser interesante ver si surge más trabajo de tuning durante hoy o en los próximos días, tanto en GCC como en LLVM/Clang, en preparación para Nova Lake.

Lectura técnica

El detalle relevante para desarrolladores de C/C++ que compilen targets específicos -march=novalake o -march=diamondrapids con versiones recientes de GCC: dos optimizaciones que el ISA APX prometía como ganancia no se manifestaron en silicio. Para roundups de benchmarks Phoronix posiblemente publique mediciones cuando Intel libere hardware de ingeniería público. Por ahora, el cambio es interno al compilador y no requiere acción del usuario: GCC tomará las nuevas reglas de tuning automáticamente al actualizar.