El AMD Ryzen 9 5950x recientemente lanzado ofrece 16 núcleos y 32 subprocesos, así que veamos qué tipo de rendimiento podemos obtener de una compilación paralela de C ++ con esos 32 subprocesos. En el momento de redactar este artículo, AMD Ryzen 9 5950x tiene el puntaje de referencia de CPU de un solo núcleo más alto en alrededor de 3515. C ++ Builder es una herramienta de desarrollo de aplicaciones rápido para crear aplicaciones C ++ de Windows. Ofrece compilación normal y en la versión más reciente incluye un complemento llamado TwineCompile que usará los 32 subprocesos de la central eléctrica Ryzen 5950x para compilar múltiples archivos en el proyecto C ++ simultáneamente. Hicimos dos publicaciones anteriores en las que comparamos el 5950x con ~ 750k líneas de código compilado en Delphi y construimos en paralelo 300 aplicaciones nativas de Windows en Delphi.
El proyecto que utilicé para probar la compilación paralela de C ++ es una gran aplicación C ++ de Windows con 128 formularios y, según C ++ Builder, ~ 254.000 líneas de C ++. Los formularios se toman de los 50 formularios de proyectos que se encuentran en este repositorio de ejemplos multiplataforma de C ++ . Usamos las 50 formas 2 y 3 veces para llegar al número 128. Originalmente, creamos este proyecto para comparar el AMD Ryzen Threadripper 3990x que tiene 64 núcleos y 128 hilos. En cualquier caso, una vez que tuvimos 128 formularios en el proyecto, agregamos algo de C ++ genérico a cada una de las 128 unidades para llevarlas a más de 1000 líneas cada una. Tenga en cuenta que cada proyecto es una carga de trabajo diferente y los resultados en sus propios proyectos pueden variar. Diferentes características del lenguaje C ++ y configuraciones de proyectos pueden afectar los tiempos de compilación.
Las especificaciones completas de la máquina de referencia AMD Ryzen 9 5950x son AMD Ryzen 9 5950x, 64GB DDR4 3200MHz RAM, 1TB NVMe SSD + 2TB HDD, NVIDIA GeForce RTX 3070 8GB y Windows 10 Pro. Para monitorear el uso de CPU y Disk IO de la compilación paralela de C ++ Builder, utilicé Task Manager DeLuxe o TMX (que también está integrado en Delphi). Task Manager DeLuxe es bastante sorprendente por la cantidad de información que proporciona sobre su sistema Windows. TMX está disponible en MiTeC que también hace una amplia variedad de componentes Delphi que le dan acceso a mucha de la misma información que se encuentra en TMX. A continuación se muestra la vista de subprocesos de 32 CPU que proporciona TMX. Tomé esta captura de pantalla durante la compilación normal sincrónica de C ++ Builder. Puede ver en la captura de pantalla que en realidad solo está usando un solo núcleo simultáneamente para la compilación.
A continuación, echemos un vistazo a la captura de pantalla del Administrador de tareas DeLuxe poco después de la compilación paralela de C ++ utilizando TwineCompile en C ++ Builder. Verá en esta captura de pantalla que usa todos los hilos para la compilación. Puede ver cómo usó los 32 subprocesos y TMX también proporciona un práctico monitor de velocidad de reloj de la CPU, ya que el AMD Ryzen 9 5950x turbo aumenta hasta 4.9Ghz (solo 4.2Ghz en la captura de pantalla). Una cosa interesante a tener en cuenta aquí es que debido a que el aumento del turbo de 3.9 Ghz a 4.9 Ghz no es consistente, los puntos de referencia cambian unos segundos en cada ejecución.
Si quieres saber más sobre la arquitectura de la CPU AMD Ryzen 9 5950x, AMD tiene un gran video donde explican la arquitectura Zen 3.
Vayamos a la comparación de los números. Hay varios tipos diferentes de compilaciones que se pueden realizar en C ++ Builder. Esto incluye una compilación de depuración (-O0) y una compilación de lanzamiento. En la versión Release se pueden seleccionar diferentes indicadores de optimización (-O1, -O2 y -O3). Cada bandera tiene un objetivo de optimización diferente. -O1 genera el código más pequeño posible, -O2 genera el código más rápido posible y -O3 genera el código más optimizado. Según Embarcadero -O3 ofrece mejoras de velocidad de hasta el doble del rendimiento de -O2.
Las compilaciones de depuración son las más rápidas de los cuatro niveles de optimización. Esto marca la diferencia principalmente cuando se usa la compilación normal porque las compilaciones de la versión demoraron hasta un minuto más que las compilaciones de depuración. Al usar la compilación en paralelo, el proceso de compilación fue tan rápido tanto en el modo de depuración como en el de lanzamiento, que apenas importó, ya que todas las puntuaciones están bastante juntas. El primer gráfico aquí es la compilación de depuración de C ++ normal (-O0) que llega a los 396 segundos frente a la compilación de depuración de C ++ paralela (-O0) que llega a los 33 segundos (¡12 veces más rápido!). Si ejecutamos los números en líneas de código por segundo, obtenemos alrededor de 7,696 líneas de código por segundo usando TwineCompile paralelo para -O0. La compilación normal de depuración síncrona -O0 llega a 641 líneas por segundo para compilar.
En el segundo gráfico, tenemos la versión normal de C ++ Release (-O1) que llega a los 404 segundos frente a la Parallel C ++ Release Build (-O1) que llega a los 32 segundos (¡~ 12 veces más rápido!). Los segundos de construcción en paralelo varían según la velocidad actual del turbo boost (en cualquier lugar entre 3.9 Ghz y 4.9 Ghz). Si ejecutamos los números en líneas de código por segundo, obtenemos alrededor de 7937 líneas de código por segundo usando TwineCompile paralelo para -O1. La compilación normal sincrónica de -O1 llega a 628 líneas por segundo para compilar.
En el tercer gráfico, tenemos la versión normal de C ++ Release (-O2) con 449 segundos frente a la versión Parallel C ++ Release (-O2) con 37 segundos (¡~ 12 veces más rápido!). Los segundos de construcción en paralelo varían según la velocidad actual del turbo boost (en cualquier lugar entre 3.9 Ghz y 4.9 Ghz). Si ejecutamos los números en líneas de código por segundo, obtenemos alrededor de 6,864 líneas de código por segundo usando TwineCompile paralelo para -O2. La compilación de -O2 síncrona normal llega a 565 líneas por segundo para compilar.
En el cuarto y último gráfico, tenemos la versión normal de C ++ Release (-O3) que llega a los 450 segundos frente a la Parallel C ++ Release Build (-O3) que llega a los 36 segundos (¡~ 12 veces más rápido!). Los segundos de construcción en paralelo varían según la velocidad actual del turbo boost (en cualquier lugar entre 3.9 Ghz y 4.9 Ghz). Vi entre 36 segundos y 40 segundos aquí. Si ejecutamos los números en líneas de código por segundo, obtenemos alrededor de 7.055 líneas de código por segundo usando TwineCompile paralelo para -O3. La compilación de -O3 sincrónica normal llega a 564 líneas por segundo para compilar.
Basta decir que el aumento de la productividad al tener una compilación en paralelo es significativo. Ser capaz de compilar una gran aplicación C ++ en unos 30 segundos le permite iterar más rápido (similar a la velocidad de iteración que se puede hacer en Delphi) porque los tiempos de compilación son muy rápidos. Califico 128 formularios y ~ 254k líneas de código para que un proyecto de Windows sea grande. Ciertamente no es un proyecto pequeño (2-3 formularios) y ciertamente no es un proyecto masivo (millones y millones de líneas de código).
Ahora comparemos el compilador Delphi 10.4.1 con el compilador C ++ Builder Parallel. En nuestro primer blogEn esta serie, una CPU AMD Ryzen 9 5950x compila código Object Pascal pesado genérico a alrededor de 61,500 líneas por segundo que se puede extrapolar a 1 millón de líneas de código Object Pascal pesado genérico en 16 segundos. La compilación paralela de C ++ Builder (-O1) más rápida compila 7937 líneas de código por segundo que se pueden extrapolar a 1 millón de líneas de C ++ en ~ 126 segundos. La misma compilación de C ++ síncrona de C ++ Builder -O1 fue de 628 líneas de código por segundo que se pueden extrapolar a 1 millón de líneas de código C ++ en 1592 segundos. Como puede ver, la compilación paralela de C ++ Builder se acerca a la productividad de Delphi con velocidades de compilación, ya que es órdenes de magnitud más rápida que la compilación normal.C ++ Builder con compilación paralela en hardware moderno a través de TwineCompile puede acercarlo a la productividad de Delphi con la velocidad y potencia de C ++ para sus aplicaciones de Windows.
El hardware moderno es y el AMD Ryzen 9 5950x es excelente con sus 16 núcleos y 32 subprocesos, pero la CPU Ryzen 9 5950x es realmente difícil de conseguir en este momento. ¿Qué pasa con el uso de TwineCompile en una máquina más antigua? De hecho, he estado usando un i7-3770 con 4 núcleos y 8 hilos durante los últimos 8 años como mi controlador diario. Las especificaciones de esta máquina son aproximadamente un Intel i7-3770, 16GB RAM, 1TB SSD, Windows 10 Home. Su puntuación de referencia de CPU para un solo hilo es 2069 frente a 3515 en el 5950x. La única actualización que realmente le hice en 8 años fue instalar un SSD Samsung 860 EVO 1TB y eso ha marcado una gran diferencia con los tiempos de compilación. Usé Task Manager DeLuxe nuevamente y tomé capturas de pantalla de la compilación normal y la compilación paralela en la máquina i7-3770 de 8 hilos. Primero mostraremos una compilación normal en C ++ Builder. Como verá en la captura de pantalla, solo está usando alrededor del 30% de la CPU para compilar el código C ++.
A continuación, echemos un vistazo a la máquina i7-3770 nuevamente, esta vez usando C ++ Builder compilando en paralelo el mismo proyecto de 128 formularios y alrededor de 254,000 líneas de código. Como verá, esta vez está alcanzando los 4 núcleos y 8 subprocesos y utilizando toda la potencia de la máquina para compilar.
Veamos algunos números de esta máquina al compilar el mismo proyecto de C ++ Builder en formato 128 de forma sincrónica y en paralelo. El primer gráfico aquí es la compilación de depuración de C ++ normal (-O0) que llega a los 1023 segundos frente a la compilación de depuración de C ++ paralela (-O0) que llega a los 170 segundos (¡6 veces más rápido!). Si ejecutamos los números en líneas de código por segundo, obtenemos alrededor de 1494 líneas de código por segundo utilizando TwineCompile paralelo para -O0. La compilación normal de depuración síncrona -O0 llega a 248 líneas por segundo para compilar.
El segundo gráfico aquí es la versión normal de C ++ Release (-O2) que llega a los 935 segundos frente a la versión Parallel C ++ Release Build (-O2) que llega a los 142 segundos (¡~ 6 veces más rápido!). Si ejecutamos los números en líneas de código por segundo, obtenemos alrededor de 1788 líneas de código por segundo usando TwineCompile paralelo para -O2. La compilación normal de depuración síncrona -O2 llega a 271 líneas por segundo para compilar. Una cosa interesante que veo aquí es que en la máquina AMD Ryzen 9 3950x las compilaciones de depuración fueron más rápidas que las compilaciones de lanzamiento, mientras que en la máquina más antigua aquí las compilaciones de depuración son lentas. No tengo números concretos, pero supongo que esto podría deberse a que las versiones de depuración son más grandes que las versiones de lanzamiento y, por lo tanto, entra en juego la velocidad del disco duro de estado sólido.
Como puede ver incluso en hardware más antiguo, la compilación paralela de C ++ Builder proporciona un ENORME aumento de la productividad con tiempos de compilación mucho más rápidos. Si tiene una máquina más antigua y no está ejecutando un SSD como el Samsung 860 EVO, es una actualización fácil para lograr un rendimiento mucho mejor que un disco duro normal. O si está ejecutando una máquina más antigua que no es al menos de código cuádruple, puede elegir máquinas de cuatro núcleos más antiguas a un costo relativamente bajo.
En cualquier caso, independientemente del hardware que esté ejecutando (siempre que tenga al menos 2 núcleos), verá un aumento significativo del tiempo de compilación para sus proyectos de C ++ cuando utilice el último C ++ Builder con compilación en paralelo a través de TwineCompile. En esta publicación de blog, comparamos el último AMD Ryzen 9 5950x con sus 16 núcleos y 32 subprocesos y hemos demostrado de manera concluyente que puede marcar una gran diferencia para aumentar su productividad a través de la velocidad de iteración. Un proyecto de Windows C ++ relativamente grande con 128 formularios y más de 254.000 líneas de código se puede compilar en unos 30-40 segundos a través de la compilación en paralelo con 16 núcleos y 32 hilos. Eso es increíble. Una máquina más antigua que usa la compilación sincrónica normal tomó entre ~ 15 minutos y ~ 17 minutos para el mismo proyecto.
Ahora es un buen momento para ser un desarrollador de C ++ para crear aplicaciones de Windows (e iOS) en C ++. ¡Hemos visto cómo un solo núcleo en hardware antiguo puede tardar 60 minutos en compilar un proyecto C ++ con 1 millón de líneas de código que ahora solo toma ~ 2 minutos usando la compilación paralela en hardware moderno! La compilación en paralelo aporta una productividad muy necesaria al desarrollo de C ++ sin sacrificar la velocidad y la potencia del rendimiento en tiempo de ejecución de C ++. C ++ Builder 10.4.1+ es la herramienta que puede llevarlo allí.
Obtenga más información sobre el compilador C ++ Builder en Embarcadero DocWiki.
¿Aún no tienes la última versión de C ++ Builder? Echar un vistazo.