Un changement d'une ligne dans GCC a conduit à une accélération de 12 % dans un test et à un ralentissement de 14 % dans un autre.

Un ingénieur d'Intel a apporté une modification d'une ligne dans l'ensemble des compilateurs GCC, augmentant le poids des prévisions de branches incorrectes sur les processeurs x86. Cette modification a permis d'augmenter la performance du code généré de 12,7 % lors du test 544.nab_r avec les optimisations "-O2 -mtune=graniterapids" pour le CPU Intel Granite Rapids/Xeon 6, et de 12,1 % avec les optimisations "-O2 -mtune=znver5" sur le CPU AMD Zen5.

Le changement de poids de "COSTS_N_INSNS (2)" à "COSTS_N_INSNS (2) + 3" augmente la signification de l'erreur de prévision de 2 à 5 instructions conditionnelles, ce qui reflète mieux les caractéristiques des pipelines des unités de traitement modernes, où les erreurs de prévisions de branches sont plus coûteuses. Ce changement de poids force le compilateur à transformer les expressions "if" en instructions conditionnelles sans sauts, telles que CMOV, éliminant les interruptions causées par la nécessité de réinitialiser l'état du pipeline en cas de prévision incorrecte. Auparavant, le poids "COSTS_N_INSNS (2) + 3" était spécifié dans GCC uniquement pour les processeurs Intel Ice Lake et Alder Lake, et est maintenant attribué à un profil générique pour les processeurs x86.

Il est notable qu'après l'acceptation du patch, une régression est apparue, rendant le test "Hint" 30 % plus lent pour un des développeurs de GCC lors de la construction avec les options "-march=generic -mtune=znver5" et "-march=generic -mtune=graniterapids". La performance des tests SPEC2017 et SPEC2026 est restée inchangée après la modification. La présence de la régression a été confirmée par l'auteur du commit original, selon ses données, le ralentissement du test Hint s'élève à 14 % lors de la construction avec les options "-O2 -mtune=generic -march=x86-64-v3".

Le ralentissement s'explique par le fait que le code du test Hint ne comporte qu'une seule construction conditionnelle, que GCC transforme en une représentation basée sur CMOV. Cette construction est exécutée assez rarement (3 %) et son optimisation n'affecte pas les performances. De plus, la modification du mode de génération de code a entraîné un effet secondaire qui a ralenti l'exécution d'un code exécuté plus fréquemment.

Source : opennet.ru

Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS 🔥 Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS | ProHoster