Un ingegnere della Intel ha apportato una modifica al set di compilatori GCC che aumenta il peso delle previsioni di diramazione errate sui processori x86. Questa modifica ha consentito di migliorare le prestazioni del codice generato durante il test 544.nab_r del 12,7% attivando le ottimizzazioni «-O2 -mtune=graniterapids» per le CPU Intel Granite Rapids/Xeon 6 e del 12,1% attivando le ottimizzazioni «-O2 -mtune=znver5» sulle CPU AMD Zen5.
La modifica del peso da «COSTS_N_INSNS (2)» a «COSTS_N_INSNS (2) + 3» aumenta il significato dell'errore di previsione da 2 a 5 istruzioni condizionali, riflettendo meglio le caratteristiche delle pipeline nei processori moderni, dove gli errori di previsione delle diramazioni sono più costosi. Questa modifica del peso fornisce un'ottimizzazione forzata da parte del compilatore per convertire le espressioni «if» in comandi condizionali senza salti, come il CMOV, che escludono le interruzioni dovute a una previsione di diramazione errata causata dalla necessità di ripristinare lo stato della pipeline. In precedenza, il peso «COSTS_N_INSNS (2) + 3» era specificato nel GCC soltanto per i processori Intel Ice Lake e Alder Lake, ma ora è impostato per il profilo generico delle CPU x86.
È interessante notare che dopo l'applicazione della patch è emersa una regressione, che ha causato un rallentamento del test "Hint" per uno degli sviluppatori GCC, pari al 30% durante la compilazione con le opzioni "-march=generic -mtune=znver5" e "-march=generic -mtune=graniterapids". Le prestazioni dei test SPEC2017 e SPEC2026 sono rimaste invariati dopo la modifica. La regressione è stata confermata dall'autore del commit originale, che ha segnalato un rallentamento del test Hint del 14% durante la compilazione con le opzioni "-O2 -mtune=generic -march=x86-64-v3".
Il rallentamento è spiegato dal fatto che nel codice del test Hint esiste solo una condizione condizionale, convertita da GCC in una rappresentazione basata su CMOV. Questa condizione viene eseguita piuttosto raramente (nel 3%) e la sua ottimizzazione non influisce sulle prestazioni. Tuttavia, il cambiamento nel modo di generare il codice ha portato a un effetto collaterale, rallentando l'esecuzione di codice più frequentemente eseguito.
Fonte: opennet.ru
