Dans l'article cité, les auteurs utilisent GCC avec l'optimisation au niveau 2 (-O2) et non pas 3 (-O3). Cela peut expliquer largement la différence de performance.
Ensuite, ils devraient utiliser le flag -Ofast pour le code en virgule flottante : le compilateur d'Intel n'est pas aussi strict sur la norme que GCC. En particulier, il considère par défaut que les opérations sont commutatives (a + b = b + a) et associatives (a + (b + c) = (a + b) + c), ce qui n'est pas vrai en virgule flottante... et permet de nombreuses optimisations !
En outre, ils précisent qu'ils n'ont pas spécifié d'architecture (flag -march=native par exemple).
Dans ce cas, GCC optimise de sorte à se comporter convenablement sur un ensemble de processeurs cible. Ainsi, il optimise bien moins le code pour Ryzen qu'avec une architecture spécifique.
Le compilateur d'Intel détecte l'architecture automatiquement (fut un temps ils se comportaient moins bien, délibérément, pour les processeur d'AMD).
Open64 a été maintenu par AMD, c'est normal qu'il se comporte bien sur les processeurs d'AMD.
Ce serait intéressant de comparer GCC en activant la détection d'architecture (ou en spécifiant carrément l'architecture du processeur ciblé) et un niveau d'optimisation comparable vis-à-vis des normes !
[^] # Re: Performances
Posté par khivapia . En réponse à la dépêche Sortie de GCC 7.1. Évalué à 10.
Dans l'article cité, les auteurs utilisent GCC avec l'optimisation au niveau 2 (-O2) et non pas 3 (-O3). Cela peut expliquer largement la différence de performance.
Ensuite, ils devraient utiliser le flag -Ofast pour le code en virgule flottante : le compilateur d'Intel n'est pas aussi strict sur la norme que GCC. En particulier, il considère par défaut que les opérations sont commutatives (a + b = b + a) et associatives (a + (b + c) = (a + b) + c), ce qui n'est pas vrai en virgule flottante... et permet de nombreuses optimisations !
En outre, ils précisent qu'ils n'ont pas spécifié d'architecture (flag -march=native par exemple).
Dans ce cas, GCC optimise de sorte à se comporter convenablement sur un ensemble de processeurs cible. Ainsi, il optimise bien moins le code pour Ryzen qu'avec une architecture spécifique.
Le compilateur d'Intel détecte l'architecture automatiquement (fut un temps ils se comportaient moins bien, délibérément, pour les processeur d'AMD).
Open64 a été maintenu par AMD, c'est normal qu'il se comporte bien sur les processeurs d'AMD.
Ce serait intéressant de comparer GCC en activant la détection d'architecture (ou en spécifiant carrément l'architecture du processeur ciblé) et un niveau d'optimisation comparable vis-à-vis des normes !