Una modifica a una sola linea in GCC ha portato a un aumento della velocità del 12% in un test e a un rallentamento del 14% in un altro.

Un ingegnere della Intel ha apportato una modifica di una riga al pacchetto di compilatori GCC, aumentando il peso della previsione errata di ramificazione sui processori x86. La modifica ha permesso di migliorare le prestazioni del codice generato durante il test 544.nab_r del 12,7% con l'ottimizzazione "-O2 -mtune=graniterapids" per le CPU Intel Granite Rapids/Xeon 6 e del 12,1% con l'ottimizzazione "-O2 -mtune=znver5" per le CPU AMD Zen5.

La modifica del peso da "COSTS_N_INSNS (2)" a "COSTS_N_INSNS (2) + 3" aumenta la significatività dell'errore di previsione da 2 a 5 istruzioni condizionali, riflettendo meglio le caratteristiche delle pipeline nei moderni CPU, dove gli errori di previsione di ramificazione sono più costosi. La modifica del peso porta a forzare la conversione da parte del compilatore delle espressioni "if" in istruzioni condizionali senza salti, come CMOV, che escludono le interruzioni causate da previsioni sbagliate di ramificazione, dovute alla necessità di azzerare lo stato della pipeline. In precedenza, il peso "COSTS_N_INSNS (2) + 3" era indicato in GCC solo per i processori Intel Ice Lake e Alder Lake, ed ora è stato impostato per il profilo generico dei processori x86.

È notevole che, dopo l'accettazione della patch, sia emersa una regressione, che ha causato l'esecuzione del test "Hint" da parte di uno degli sviluppatori GCC con un rallentamento del 30% durante la compilazione con le opzioni "-march=generic -mtune=znver5" e "-march=generic -mtune=graniterapids". Le prestazioni dei test SPEC2017 e SPEC2026 dopo la modifica sono rimaste allo stesso livello. La regressione è stata confermata dall'autore del commit originale, che ha riportato un rallentamento del 14% nell'esecuzione del test Hint 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 una sola costruzione condizionale, che viene convertita da GCC in una rappresentazione basata su CMOV. Questa costruzione viene eseguita abbastanza raramente (nel 3%) e la sua ottimizzazione non influisce sulle prestazioni. Tuttavia, la modifica della modalità di generazione del codice ha portato a un effetto collaterale che ha rallentato l'esecuzione di un codice più frequentemente eseguito.

Fonte: opennet.ru

Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster