Have an amazing solution built in RAD Studio? Let us know. Looking for discounts? Visit our Special Offers page!
CodeNouvelles

Compilez 1 million de lignes de C ++ en ~ 2 minutes avec un Ryzen 9 5950x à 16 cœurs

cppparallelcompile

L’AMD Ryzen 9 5950x récemment publié offre 16 cœurs et 32 ​​threads, voyons donc quel type de performance nous pouvons obtenir d’une compilation C ++ parallèle avec ces 32 threads. Au moment d’écrire ces lignes, l’AMD Ryzen 9 5950x a le score de référence de processeur monocœur le plus élevé à environ 3515. C ++ Builder est un outil de développement rapide d’applications pour créer des applications Windows C ++. Il offre une compilation normale et dans la version la plus récente comprend un module complémentaire appelé TwineCompile qui utilisera les 32 threads de la centrale Ryzen 5950x pour compiler simultanément plusieurs fichiers dans le projet C ++. Nous avons publié deux articles précédents dans lesquels nous avons évalué le 5950x avec une compilation d’environ 750 000 lignes de code dans Delphi et la création parallèle de 300 applications Windows natives dans Delphi..

Le projet que j’ai utilisé pour tester la compilation parallèle C ++ est une grande application Windows C ++ avec 128 formulaires et selon C ++ Builder ~ 254 000 lignes de C ++. Les formulaires sont tirés des 50 formulaires de projet trouvés dans ce référentiel C ++ Cross Platform Samples . Nous avons utilisé les 50 formes 2 et 3 fois pour obtenir le nombre 128. À l’origine, nous avons construit ce projet pour comparer l’AMD Ryzen Threadripper 3990x qui a 64 cœurs et 128 threads. Quoi qu’il en soit, une fois que nous avons eu 128 formulaires dans le projet, nous avons ajouté du C ++ générique à chacune des 128 unités pour les amener à plus de 1000 lignes chacune. Gardez à l’esprit que chaque projet est une charge de travail différente et que les résultats de vos propres projets peuvent varier. Différentes fonctionnalités du langage C ++ et configurations de projet peuvent affecter les temps de compilation.

ryzencpu
Ryzen Image gracieuseté d’AMD

Les spécifications complètes de la machine de référence AMD Ryzen 9 5950x sont AMD Ryzen 9 5950x, 64 Go de RAM DDR4 3200 MHz, 1 To SSD NVMe + 2 To de disque dur, NVIDIA GeForce RTX 3070 8 Go et Windows 10 Pro. Afin de surveiller l’utilisation du CPU et des E / S disque de la compilation parallèle de C ++ Builder, j’ai utilisé  Task Manager DeLuxe  ou TMX (qui est également intégré à Delphi). Le Gestionnaire de tâches DeLuxe est assez étonnant par la quantité d’informations qu’il fournit concernant votre système Windows. TMX est disponible auprès de  MiTeC qui fait également une grande variété de composants Delphi qui vous donnent accès à une grande partie des mêmes informations trouvées dans TMX. Vous trouverez ci-dessous la vue de 32 threads CPU fournie par TMX. J’ai pris cette capture d’écran lors de la compilation synchrone normale de C ++ Builder. Vous pouvez voir sur la capture d’écran qu’il n’utilise en réalité qu’un seul cœur simultanément pour la compilation.

cppreleasenormalduring-1700887-2

Jetons ensuite un coup d’œil à la capture d’écran du gestionnaire de tâches DeLuxe peu après la compilation parallèle C ++ à l’aide de TwineCompile dans C ++ Builder. Vous verrez dans cette capture d’écran qu’il utilise tous les threads pour la compilation. Vous pouvez voir comment il a utilisé les 32 threads et TMX fournit également un moniteur de vitesse d’horloge du processeur pratique, car le turbo AMD Ryzen 9 5950x augmente jusqu’à 4,9 GHz (seulement 4,2 GHz dans la capture d’écran). Une chose intéressante à noter ici est que, parce que le turbo passant de 3,9 Ghz à 4,9 Ghz n’est pas cohérent, les repères changent de quelques secondes à chaque exécution.

cppreleasetwine_during

Si vous voulez en savoir plus sur l’architecture du processeur AMD Ryzen 9 5950x, AMD a une excellente vidéo où ils expliquent l’architecture Zen 3.

Passons à la comparaison des nombres. Il existe différents types de builds qui peuvent être effectués dans C ++ Builder. Cela inclut une version Debug (-O0) et une version Release. Sur la version Release, différents indicateurs d’optimisation peuvent être sélectionnés (-O1, -O2 et -O3). Chaque indicateur a une cible d’optimisation différente. -O1 génère le code le plus petit possible, -O2 génère le code le plus rapide possible et -O3 génère le code le plus optimisé. Selon Embarcadero -O3 donne des améliorations de vitesse jusqu’à deux fois les performances de -O2.

Les versions de débogage sont les plus rapides des quatre niveaux d’optimisation. Cela fait principalement une différence lors de l’utilisation de la compilation normale, car il a fallu jusqu’à une minute de plus pour les versions Release que pour les versions Debug. Lors de l’utilisation de la compilation parallèle, le processus de construction était si rapide en mode Debug et Release qu’il importait peu car tous les scores sont assez proches les uns des autres. Le premier graphique ici est la construction de débogage C ++ normal (-O0) qui arrive à 396 secondes et la construction de débogage parallèle C ++ (-O0) arrive à 33 secondes (12X plus rapide!). Si nous exécutons les nombres sur des lignes de code par seconde, nous obtenons environ 7 696 lignes de code par seconde en utilisant le TwineCompile parallèle pour -O0. La compilation synchrone de débogage normale -O0 arrive à 641 lignes par seconde à compiler.

debugbuildchart

Dans le deuxième graphique, nous avons la version de version normale du C ++ (-O1) à 404 secondes et la version de version parallèle de C ++ (-O1) à 32 secondes (~ 12X plus rapide!). Les secondes de construction parallèle varient en fonction de la vitesse actuelle du turbo boost (entre 3,9 Ghz et 4,9 Ghz). Si nous exécutons les nombres sur des lignes de code par seconde, nous obtenons environ 7937 lignes de code par seconde en utilisant le TwineCompile parallèle pour -O1. La construction synchrone normale -O1 arrive à 628 lignes par seconde à compiler.

o1buildchart

Dans le troisième graphique, nous avons la version de version normale du C ++ (-O2) à 449 secondes et la version de version parallèle de C ++ (-O2) à 37 secondes (~ 12X plus rapide!). Les secondes de construction parallèle varient en fonction de la vitesse actuelle du turbo boost (entre 3,9 Ghz et 4,9 Ghz). Si nous exécutons les nombres sur des lignes de code par seconde, nous obtenons environ 6 864 lignes de code par seconde en utilisant le TwineCompile parallèle pour -O2. La construction synchrone normale -O2 arrive à 565 lignes par seconde à compiler.

o2_buildchart

Dans le quatrième et dernier graphique, nous avons la version de version normale de C ++ (-O3) qui arrive à 450 secondes et la version de version parallèle de C ++ (-O3) arrive à 36 secondes (~ 12X plus rapide!). Les secondes de construction parallèle varient en fonction de la vitesse actuelle du turbo boost (entre 3,9 Ghz et 4,9 Ghz). J’ai vu entre 36 et 40 secondes ici. Si nous exécutons les nombres sur des lignes de code par seconde, nous obtenons environ 7 055 lignes de code par seconde en utilisant le TwineCompile parallèle pour -O3. La construction synchrone normale -O3 arrive à 564 lignes par seconde à compiler.

o3_buildchart

Autant dire que l’augmentation de la productivité grâce à la compilation parallèle est significative. Être capable de compiler une grande application C ++ en environ 30 secondes vous permet d’itérer plus rapidement (similaire à la vitesse d’itération qui peut être effectuée dans Delphi) car les temps de compilation sont très rapides. J’utilise 128 formulaires et environ 254 000 lignes de code pour qu’un projet Windows soit volumineux. Ce n’est certainement pas un petit projet (2-3 formulaires) et ce n’est certainement pas un projet massif (des millions et des millions de lignes de code).

Comparons maintenant le compilateur Delphi 10.4.1 à la compilation parallèle C ++ Builder. Dans notre premier blog in this series an AMD Ryzen 9 5950x CPU compiles generics heavy Object Pascal code at around 61,500 lines per second which can be extrapolated to 1 million lines of generics heavy Object Pascal code in 16 seconds. The fastest C++Builder parallel build (-O1) compiles 7,937 lines of code per second which can be extrapolated to 1 million lines of C++ in ~126 seconds. The same C++Builder -O1 synchronous C++ compile was 628 lines of code per second which can be extrapolated to 1 million lines of C++ code in 1592 seconds. As you can see the C++Builder parallel compile approaches the productivity of Delphi with compile speeds as it is orders of magnitude faster than the normal compile. C++Builder with parallel compilation on modern hardware through TwineCompile can bring you close to the productivity of Delphi with the speed and power of C++ for your Windows applications.

cppvcppvsdelphi-1288972-2

Le matériel moderne est et l’AMD Ryzen 9 5950x est excellent avec ses 16 cœurs et 32 ​​threads, mais le processeur Ryzen 9 5950x est en fait difficile à obtenir pour le moment. Qu’en est-il de l’utilisation de TwineCompile sur une machine plus ancienne? J’utilise en fait un i7-3770 avec 4 cœurs et 8 threads depuis 8 ans comme pilote quotidien. Les spécifications de cette machine sont à peu près un Intel i7-3770, 16 Go de RAM, 1 To SSD, Windows 10 Home. Son score de référence CPU pour un seul thread est 2069 contre 3515 sur le 5950x. La seule mise à jour que j’ai vraiment apportée en 8 ans a été de mettre un SSD Samsung 860 EVO 1 To et cela a fait une énorme différence avec les temps de compilation. J’ai de nouveau utilisé Task Manager DeLuxe et pris des captures d’écran de la compilation normale et de la compilation parallèle sur la machine à 8 threads i7-3770. Nous allons d’abord montrer une compilation normale dans C ++ Builder. Comme vous le verrez sur la capture d’écran, il n’utilise qu’environ 30% du processeur pour compiler le code C ++.

i73770releasenormal

Examinons ensuite à nouveau la machine i7-3770 cette fois en utilisant C ++ Builder en compilant en parallèle le même projet de 128 formulaires et environ 254 000 lignes de code. Comme vous le verrez cette fois, il atteint les 4 cœurs et 8 threads et utilise toute la puissance de la machine pour compiler.

i73770debugtwine

Voyons quelques chiffres de cette machine lors de la compilation du même projet C ++ Builder à 128 formulaires de manière synchrone et en parallèle. Le premier graphique ici est la construction de débogage C ++ normal (-O0) qui arrive à 1023 secondes vers la construction de débogage C ++ parallèle (-O0) à 170 secondes (6X plus rapide!). Si nous exécutons les nombres sur des lignes de code par seconde, nous obtenons environ 1494 lignes de code par seconde en utilisant le TwineCompile parallèle pour -O0. La compilation synchrone de débogage normale -O0 arrive à 248 lignes par seconde à compiler.

debugbuildchart_3770-7104484-2

Le deuxième graphique ici est la version de version normale du C ++ (-O2) qui arrive à 935 secondes et la version de version parallèle de C ++ (-O2) arrive à 142 secondes (~ 6X plus rapide!). Si nous exécutons les nombres sur des lignes de code par seconde, nous obtenons environ 1788 lignes de code par seconde en utilisant le TwineCompile parallèle pour -O2. La compilation synchrone de débogage normale -O2 arrive à 271 lignes par seconde à compiler. Une chose intéressante que je vois ici est que sur la machine AMD Ryzen 9 3950x, les versions de débogage étaient plus rapides que les versions de version où, comme sur l’ancienne machine, les versions de débogage sont lentes. Je n’ai pas de chiffres précis mais je suppose que cela pourrait être dû au fait que les versions de débogage sont plus grandes que les versions de version et que la vitesse du disque dur à semi-conducteurs entre en jeu.

releasebuildchart_3770

Comme vous pouvez le voir, même sur du matériel plus ancien, la compilation parallèle C ++ Builder fournit un énorme gain de productivité avec des temps de compilation beaucoup plus rapides. Si vous avez une machine plus ancienne et que vous n’utilisez pas un SSD comme le Samsung 860 EVO, il s’agit d’une mise à niveau facile pour obtenir de bien meilleures performances par rapport à un disque dur normal. Ou si vous utilisez une machine plus ancienne qui n’est pas au moins un quadricode, vous pouvez vous procurer des machines quad core plus anciennes pour un coût relativement faible.

Dans tous les cas, quel que soit le matériel que vous utilisez (tant qu’il a au moins 2 cœurs), vous verrez une augmentation significative du temps de compilation pour vos projets C ++ lors de l’utilisation du dernier C ++ Builder avec une compilation parallèle via TwineCompile. Dans cet article de blog, nous avons comparé le dernier AMD Ryzen 9 5950x avec ses 16 cœurs et 32 ​​threads et avons démontré de manière concluante qu’il peut faire une énorme différence pour augmenter votre productivité grâce à la vitesse d’itération. Un projet Windows C ++ relativement volumineux avec 128 formulaires et plus de 254 000 lignes de code peut être compilé en environ 30 à 40 secondes grâce à une compilation parallèle avec 16 cœurs et 32 ​​threads. C’est incroyable. Une machine plus ancienne utilisant une compilation synchrone normale prenait entre ~ 15 minutes et ~ 17 minutes pour le même projet!

C’est le moment idéal pour devenir développeur C ++ pour créer des applications Windows (et iOS) en C ++. Nous avons vu comment un seul cœur sur du matériel plus ancien peut prendre 60 minutes pour compiler un projet C ++ avec 1 million de lignes de code, ce qui ne prend maintenant que ~ 2 minutes en utilisant la compilation parallèle sur du matériel moderne! La compilation parallèle apporte la productivité indispensable au développement C ++ sans sacrifier la vitesse et la puissance des performances d’exécution de C ++. C ++ Builder 10.4.1+ est l’outil qui peut vous y amener.

En savoir plus sur le compilateur C ++ Builder dans Embarcadero DocWiki.

Vous n’avez pas encore la dernière version de C ++ Builder? Regarde.


Reduce development time and get to market faster with RAD Studio, Delphi, or C++Builder.
Design. Code. Compile. Deploy.
Start Free Trial   Upgrade Today

   Free Delphi Community Edition   Free C++Builder Community Edition

Leave a Reply

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.

IN THE ARTICLES