Ícone do site Embarcadero RAD Studio, Delphi, & C++Builder Blogs

Compile 1 milhão de linhas de C++ em aproximadamente 2 minutos com um 16 Core Ryzen 9 5950x

cppparallelcompile

O recém-lançado AMD Ryzen 9 5950x oferece 16 núcleos e 32 threads, então vamos ver que tipo de desempenho podemos obter de uma compilação paralela de C ++ com esses 32 threads. No momento em que este artigo foi escrito, o AMD Ryzen 9 5950x tinha a pontuação de benchmark de CPU de núcleo único mais alta, em torno de 3515. C ++ Builder é uma ferramenta de desenvolvimento de aplicativos rápida para criar aplicativos C ++ do Windows. Ele oferece compilação normal e na versão mais recente inclui um add-on chamado TwineCompile que usará todos os 32 threads do Ryzen 5950x powerhouse para compilar vários arquivos no projeto C ++ simultaneamente. Fizemos dois posts anteriores onde comparamos o 5950x com ~ 750k linhas de compilação de código em Delphi e construção paralela de 300 aplicativos nativos do Windows em Delphi.

O projeto que usei para testar a compilação paralela C ++ é um grande aplicativo C ++ do Windows com 128 formulários e, de acordo com o C ++ Builder, aproximadamente 254.000 linhas de C ++. Os formulários são retirados dos 50 formulários de projeto encontrados neste repositório C ++ Cross Platform Samples . Usamos os 50 formulários 2 e 3 vezes para chegar ao número 128. Originalmente, construímos este projeto para comparar o AMD Ryzen Threadripper 3990x, que tem 64 núcleos e 128 threads. Em qualquer caso, uma vez que tínhamos 128 formulários no projeto, adicionamos algum C ++ genérico a cada uma das 128 unidades para aumentá-las para mais de 1000 linhas cada. Lembre-se de que cada projeto representa uma carga de trabalho diferente e os resultados em seus próprios projetos podem variar. Diferentes recursos da linguagem C ++ e configurações de projeto podem afetar os tempos de compilação.

Ryzen Imagem cortesia da AMD

As especificações completas na máquina de benchmark AMD Ryzen 9 5950x são AMD Ryzen 9 5950x, 64 GB DDR4 3200 MHz de RAM, 1 TB NVMe SSD + 2 TB HDD, NVIDIA GeForce RTX 3070 8 GB e Windows 10 Pro. Para monitorar o uso da CPU e do disco IO da compilação paralela do C ++ Builder, usei  o Gerenciador de Tarefas DeLuxe  ou TMX (que também é construído em Delphi). O Task Manager DeLuxe é incrível pela quantidade de informações que fornece sobre o seu sistema Windows. TMX está disponível no  MiTeC que também produz uma grande variedade de componentes Delphi que fornecem acesso a muitas das mesmas informações encontradas no TMX. Abaixo está a visualização de 32 threads de CPU que a TMX oferece. Eu fiz esta captura de tela durante a compilação normal do C ++ Builder síncrono. Você pode ver na imagem que ele está realmente usando apenas um único núcleo simultaneamente para a compilação.

A seguir, vamos dar uma olhada na captura de tela do Task Manager DeLuxe logo após a compilação paralela do C ++ usando TwineCompile no C ++ Builder. Você verá nesta imagem que ele usa todos os tópicos para a compilação. Você pode ver como ele usou todos os 32 threads e o TMX também oferece um prático monitor de velocidade do clock da CPU, já que o turbo AMD Ryzen 9 5950x aumenta para 4,9 GHz (apenas 4,2 GHz na imagem). Uma coisa interessante a notar aqui é que, como o turbo que aumenta de 3,9 Ghz para 4,9 Ghz não é consistente, os benchmarks mudam alguns segundos a cada execução.

Se você quiser saber mais sobre a arquitetura de CPU AMD Ryzen 9 5950x, a AMD tem um ótimo vídeo onde explica a arquitetura Zen 3.

Vamos fazer a comparação dos números. Existem vários tipos diferentes de compilações que podem ser feitas no C ++ Builder. Isso inclui uma compilação de depuração (-O0) e uma compilação de lançamento. Na versão Release, diferentes sinalizadores de otimização podem ser selecionados (-O1, -O2 e -O3). Cada sinalizador possui um alvo de otimização diferente. -O1 gera o menor código possível, -O2 gera o código mais rápido possível e -O3 gera o código mais otimizado. De acordo com a Embarcadero -O3 oferece melhorias de velocidade de até duas vezes o desempenho de -O2.

As compilações de depuração são as mais rápidas dos quatro níveis de otimização. Isso faz a diferença principalmente ao usar a compilação normal porque demorou um minuto a mais para as compilações de Release do que as compilações de Debug. Ao usar a compilação paralela, o processo de construção foi tão rápido no modo de depuração e no modo de liberação que quase não importou, pois todas as pontuações estão muito próximas. O primeiro gráfico aqui é a compilação de depuração C ++ normal (-O0) chegando em 396 segundos versus a compilação de depuração C ++ paralela (-O0) chegando em 33 segundos (12X mais rápido!). Se executarmos os números em linhas de código por segundo, obteremos cerca de 7.696 linhas de código por segundo usando o TwineCompile paralelo para -O0. A compilação síncrona de depuração normal -O0 vem com 641 linhas por segundo para compilar.

No segundo gráfico, temos a versão Normal C ++ Release (-O1) chegando a 404 segundos versus a versão Parallel C ++ Release (-O1) chegando a 32 segundos (~ 12X mais rápido!). Os segundos de construção paralela variam dependendo da velocidade atual do turbo boost (em qualquer lugar entre 3,9 Ghz e 4,9 Ghz). Se executarmos os números em linhas de código por segundo, obteremos cerca de 7.937 linhas de código por segundo usando o TwineCompile paralelo para -O1. A compilação síncrona normal -O1 vem em 628 linhas por segundo para compilar.

No terceiro gráfico, temos a versão Normal C ++ Release (-O2) chegando em 449 segundos versus a versão Parallel C ++ Release Build (-O2) chegando em 37 segundos (~ 12X mais rápido!). Os segundos de construção paralela variam dependendo da velocidade atual do turbo boost (em qualquer lugar entre 3,9 Ghz e 4,9 Ghz). Se executarmos os números em linhas de código por segundo, obteremos cerca de 6.864 linhas de código por segundo usando o TwineCompile paralelo para -O2. O build normal de -O2 síncrono chega a 565 linhas por segundo para compilar.

No quarto e último gráfico, temos a versão Normal C ++ Release (-O3) chegando a 450 segundos versus a versão Parallel C ++ Release Build (-O3) chegando a 36 segundos (~ 12X mais rápido!). Os segundos de construção paralela variam dependendo da velocidade atual do turbo boost (em qualquer lugar entre 3,9 Ghz e 4,9 Ghz). Eu vi entre 36 segundos e 40 segundos aqui. Se executarmos os números em linhas de código por segundo, obteremos cerca de 7.055 linhas de código por segundo usando o TwineCompile paralelo para -O3. A compilação síncrona normal -O3 vem com 564 linhas por segundo para compilar.

Basta dizer que o aumento da produtividade por ter compilação paralela é significativo. Ser capaz de compilar um aplicativo C ++ grande em cerca de 30 segundos permite que você itere mais rápido (semelhante à velocidade de iteração que pode ser feita no Delphi) porque os tempos de compilação são muito rápidos. Eu considero 128 formulários e ~ 254k linhas de código para um projeto do Windows ser grande. Certamente não é um projeto pequeno (2-3 formulários) e certamente não é um projeto enorme (milhões e milhões de linhas de código).

Agora vamos comparar o compilador Delphi 10.4.1 com a compilação C ++ Builder Parallel. No nosso primeiro blognesta série, uma CPU AMD Ryzen 9 5950x compila código Object Pascal pesado de genéricos em cerca de 61.500 linhas por segundo, que pode ser extrapolado para 1 milhão de linhas de código Object Pascal pesado de genéricos em 16 segundos. A compilação paralela mais rápida do C ++ Builder (-O1) compila 7.937 linhas de código por segundo, que podem ser extrapoladas para 1 milhão de linhas de C ++ em aproximadamente 126 segundos. A mesma compilação C ++ síncrona do C ++ Builder -O1 tinha 628 linhas de código por segundo, que podem ser extrapoladas para 1 milhão de linhas de código C ++ em 1592 segundos. Como você pode ver, a compilação paralela do C ++ Builder se aproxima da produtividade do Delphi com velocidades de compilação, pois é ordens de magnitude mais rápida do que a compilação normal.O C ++ Builder com compilação paralela em hardware moderno por meio do TwineCompile pode aproximar você da produtividade do Delphi com a velocidade e o poder do C ++ para seus aplicativos Windows.

O hardware moderno é, e o AMD Ryzen 9 5950x é ótimo com seus 16 núcleos e 32 threads, mas o CPU Ryzen 9 5950x é realmente difícil de conseguir no momento. Que tal usar o TwineCompile em uma máquina mais antiga? Na verdade, tenho usado um i7-3770 com 4 núcleos e 8 threads nos últimos 8 anos como meu driver diário. As especificações desta máquina são aproximadamente Intel i7-3770, 16 GB de RAM, SSD de 1 TB, Windows 10 Home. Sua pontuação de benchmark de CPU para um único thread é 2069 contra 3515 no 5950x. A única atualização que eu realmente fiz em 8 anos foi colocar um SSD Samsung 860 EVO de 1 TB e isso fez uma grande diferença nos tempos de compilação. Usei o Gerenciador de Tarefas DeLuxe novamente e tirei screenshots da compilação normal e da compilação paralela na máquina de 8 threads i7-3770. Primeiro, mostraremos uma compilação normal no C ++ Builder. Como você verá na imagem, ele usa apenas cerca de 30% da CPU para compilar o código C ++.

A seguir, vamos dar uma olhada na máquina i7-3770 novamente, desta vez usando o C ++ Builder, compilando paralelamente o mesmo projeto de 128 formulários e cerca de 254.000 linhas de código. Como você verá desta vez, ele está atingindo todos os 4 núcleos e 8 threads e usando todo o poder da máquina para compilar.

Vamos ver alguns números dessa máquina ao compilar o mesmo projeto C ++ Builder de 128 formulários de forma síncrona e em paralelo. O primeiro gráfico aqui é a compilação de depuração C ++ normal (-O0) chegando a 1023 segundos versus a compilação de depuração C ++ paralela (-O0) chegando a 170 segundos (6X mais rápido!). Se executarmos os números em linhas de código por segundo, obteremos cerca de 1494 linhas de código por segundo usando o TwineCompile paralelo para -O0. A compilação normal de depuração síncrona -O0 vem com 248 linhas por segundo para compilar.

O segundo gráfico aqui é a versão normal do C ++ (-O2) chegando a 935 segundos versus a versão paralela do C ++ (-O2) chegando a 142 segundos (~ 6X mais rápido!). Se executarmos os números em linhas de código por segundo, obteremos cerca de 1788 linhas de código por segundo usando o TwineCompile paralelo para -O2. A compilação de -O2 síncrona de depuração normal vem com 271 linhas por segundo para compilar. Uma coisa interessante que vejo aqui é que na máquina AMD Ryzen 9 3950x as compilações de depuração foram mais rápidas do que as compilações de lançamento, onde, como na máquina mais antiga, as compilações de depuração são lentas. Não tenho nenhum número fixo, mas acho que isso pode ser devido a compilações de depuração serem maiores do que as compilações de lançamento e, portanto, a velocidade do disco rígido de estado sólido entra em jogo.

Como você pode ver, mesmo em hardware mais antigo, a compilação paralela do C ++ Builder fornece um ENORME aumento de produtividade com tempos de compilação muito mais rápidos. Se você tem uma máquina mais antiga e não está executando um SSD como o Samsung 860 EVO, essa é uma atualização fácil para obter um desempenho muito melhor em um disco rígido normal. Ou se você estiver executando uma máquina mais antiga que não seja pelo menos quad code, você pode adquirir máquinas quad core mais antigas por um custo relativamente baixo.

Em qualquer caso, independentemente do hardware que você está executando (desde que tenha pelo menos 2 núcleos), você verá um aumento significativo no tempo de compilação para seus projetos C ++ ao usar o C ++ Builder mais recente com compilação paralela por meio do TwineCompile. Nesta postagem do blog, comparamos o último AMD Ryzen 9 5950x com seus 16 núcleos e 32 threads e mostramos de forma conclusiva que ele pode fazer uma grande diferença para aumentar sua produtividade por meio da velocidade de iteração. Um projeto Windows C ++ relativamente grande com 128 formulários e mais de 254.000 linhas de código pode ser compilado em cerca de 30-40 segundos por meio da compilação paralela com 16 núcleos e 32 threads. Isso é incrivel. Uma máquina mais antiga usando compilação síncrona normal levou entre ~ 15 minutos e ~ 17 minutos para o mesmo projeto!

Agora é um ótimo momento para ser um desenvolvedor C ++ para criar aplicativos do Windows (e iOS) em C ++. Vimos como um único núcleo em hardware mais antigo pode levar 60 minutos para compilar um projeto C ++ com 1 milhão de linhas de código, o que agora leva apenas cerca de 2 minutos usando compilação paralela em hardware moderno! A compilação paralela traz a produtividade necessária para o desenvolvimento em C ++ sem sacrificar a velocidade e o poder do desempenho de tempo de execução do C ++. C ++ Builder 10.4.1+ é a ferramenta que pode levar você até lá.

Descubra mais sobre o compilador C ++ Builder no Embarcadero DocWiki.

Ainda não tem a versão mais recente do C ++ Builder? Dê uma olhada.

Sair da versão mobile