Site icon Embarcadero RAD Studio, Delphi, & C++Builder Blogs

Скомпилируйте 1 миллион строк C++ за ~ 2 минуты с 16-ядерным процессором Ryzen 9 5950x

cppparallelcompile

Недавно выпущенный AMD Ryzen 9 5950x предлагает 16 ядер и 32 потока, поэтому давайте посмотрим, какую производительность мы можем получить от параллельной компиляции C ++ с этими 32 потоками. На момент написания этой статьи AMD Ryzen 9 5950x имел наивысший балл в тесте одноядерного процессора — около 3515. C ++ Builder — это инструмент быстрой разработки приложений для создания приложений Windows на C ++. Он предлагает обычную компиляцию и в самой последней версии включает надстройку TwineCompile, которая будет использовать все 32 потока от процессора Ryzen 5950x для одновременной компиляции нескольких файлов в проекте C ++. Мы сделали два предыдущих поста, в которых мы протестировали 5950x с ~ 750 тыс. Строк кода, скомпилированным в Delphi, и параллельным построением 300 собственных приложений Windows в Delphi..

Проект, который я использовал для тестирования параллельной компиляции C ++, представляет собой большое приложение для Windows на C ++ со 128 формами и, согласно C ++ Builder, ~ 254 000 строк на C ++. Формы взяты из 50 форм проекта, которые можно найти в этом репозитории C ++ Cross Platform Samples . Мы использовали 50 форм 2 и 3 раза, чтобы получить число 128. Первоначально мы создали этот проект для тестирования AMD Ryzen Threadripper 3990x, который имеет 64 ядра и 128 потоков. В любом случае, когда у нас было 128 форм в проекте, мы добавили некоторый общий C ++ к каждому из 128 модулей, чтобы увеличить их количество до 1000 строк в каждой. Помните, что каждый проект представляет собой отдельную рабочую нагрузку, и результаты в ваших собственных проектах могут отличаться. Различные функции языка C ++ и конфигурации проекта могут влиять на время компиляции.

Ryzen Изображение любезно предоставлено AMD

Полные спецификации тестового компьютера AMD Ryzen 9 5950x: AMD Ryzen 9 5950x, ОЗУ DDR4 3200 МГц объемом 64 ГБ, твердотельный накопитель NVMe 1 ТБ + жесткий диск 2 ТБ, NVIDIA GeForce RTX 3070 8 ГБ и Windows 10 Pro. Чтобы отслеживать использование CPU и Disk IO в параллельной компиляции C ++ Builder, я использовал  диспетчер задач DeLuxe  или TMX (который также встроен в Delphi). Диспетчер задач DeLuxe впечатляет объемом информации о вашей системе Windows. TMX доступен в  MiTeC который также создает широкий спектр компонентов Delphi, которые предоставляют вам доступ к той же информации, что и в TMX. Ниже представлен обзор потоков 32 CPU, который предоставляет TMX. Я сделал этот снимок экрана во время обычной синхронной компиляции C ++ Builder. На скриншоте видно, что на самом деле для компиляции одновременно используется только одно ядро.

Теперь давайте посмотрим на снимок экрана из диспетчера задач DeLuxe вскоре после параллельной компиляции C ++ с использованием TwineCompile в C ++ Builder. На этом снимке экрана вы увидите, что он использует все потоки для компиляции. Вы можете увидеть, как он использовал все 32 потока, а TMX также предоставляет удобный монитор тактовой частоты процессора, поскольку AMD Ryzen 9 5950x Turbo увеличивает до 4,9 ГГц (только 4,2 ГГц на скриншоте). Здесь следует отметить одну интересную вещь: поскольку турбо-ускорение с 3,9 ГГц до 4,9 ГГц не является согласованным, тесты меняются на несколько секунд при каждом запуске.

Если вы хотите узнать больше об архитектуре процессора AMD Ryzen 9 5950x, у AMD есть отличное видео, в котором объясняется архитектура Zen 3.

Приступим к сравнению чисел. В C ++ Builder можно выполнить несколько различных сборок. Это включает сборку отладки (-O0) и сборку выпуска. В сборке Release можно выбрать различные флаги оптимизации (-O1, -O2 и -O3). У каждого флага своя цель оптимизации. -O1 генерирует минимально возможный код, -O2 генерирует максимально быстрый код, а -O3 генерирует наиболее оптимизированный код. Согласно Embarcadero -O3 дает увеличение скорости вдвое по сравнению с -O2.

Сборки отладки — самые быстрые из четырех уровней оптимизации. В основном это имеет значение при использовании обычной компиляции, потому что сборки Release занимали на минуту больше, чем сборки Debug. При использовании параллельной компиляции процесс сборки был настолько быстрым как в режиме отладки, так и в режиме выпуска, что это не имело значения, поскольку все оценки довольно близки. Первая диаграмма здесь — это нормальная отладочная сборка C ++ (-O0), приходящаяся на 396 секунд, по сравнению с параллельной отладочной сборкой C ++ (-O0), приходящая на 33 секунды (в 12 раз быстрее!). Если мы запускаем числа по строкам кода в секунду, мы получаем около 7 696 строк кода в секунду, используя параллельный TwineCompile для -O0. Обычная отладочная синхронная сборка -O0 занимает 641 строку в секунду для компиляции.

На второй диаграмме мы видим, что нормальная сборка выпуска C ++ (-O1) приходит через 404 секунды, а сборка параллельной версии C ++ (-O1) — за 32 секунды (примерно в 12 раз быстрее!). Секунды параллельной сборки варьируются в зависимости от текущей скорости турбо-ускорения (от 3,9 до 4,9 ГГц). Если мы запустим числа по строкам кода в секунду, мы получим около 7937 строк кода в секунду, используя параллельный TwineCompile для -O1. Обычная синхронная сборка -O1 требует компиляции 628 строк в секунду.

На третьей диаграмме мы видим, что нормальная сборка выпуска C ++ (-O2) приходит через 449 секунд, тогда как сборка параллельной версии C ++ (-O2) приходит через 37 секунд (примерно в 12 раз быстрее!). Секунды параллельной сборки варьируются в зависимости от текущей скорости турбо-ускорения (от 3,9 до 4,9 ГГц). Если мы запустим числа по строкам кода в секунду, мы получим около 6864 строк кода в секунду, используя параллельный TwineCompile для -O2. Обычная синхронная сборка -O2 требует компиляции 565 строк в секунду.

На четвертой и последней диаграмме у нас есть сборка выпуска Normal C ++ (-O3), выходящая за 450 секунд, по сравнению с сборкой выпуска Parallel C ++ (-O3), приходящаяся на 36 секунд (примерно в 12 раз быстрее!). Секунды параллельной сборки варьируются в зависимости от текущей скорости турбо-ускорения (от 3,9 до 4,9 ГГц). Я видел здесь от 36 до 40 секунд. Если мы запустим числа по строкам кода в секунду, мы получим около 7055 строк кода в секунду, используя параллельный TwineCompile для -O3. Обычная синхронная сборка -O3 требует компиляции 564 строк в секунду.

Достаточно сказать, что параллельная компиляция значительно повысила производительность. Возможность скомпилировать большое приложение на C ++ примерно за 30 секунд позволяет выполнять итерацию быстрее (аналогично скорости итерации, которую можно выполнить в Delphi), потому что время компиляции очень быстрое. Я называю 128 форм и ~ 254 тыс. Строк кода для проекта Windows большим. Это, конечно, не маленький проект (2-3 формы) и уж точно не масштабный проект (миллионы и миллионы строк кода).

Теперь сравним компилятор Delphi 10.4.1 с параллельной компиляцией C ++ Builder. В нашем первом блогеВ этой серии ЦП AMD Ryzen 9 5950x компилирует обобщенный тяжелый код Object Pascal со скоростью около 61 500 строк в секунду, который может быть экстраполирован на 1 миллион строк тяжелого универсального кода Object Pascal за 16 секунд. Самая быстрая параллельная сборка C ++ Builder (-O1) компилирует 7937 строк кода в секунду, которые можно экстраполировать на 1 миллион строк C ++ за ~ 126 секунд. Тот же самый синхронный компилятор C ++ Builder -O1 составлял 628 строк кода в секунду, которые можно экстраполировать на 1 миллион строк кода C ++ за 1592 секунды. Как видите, параллельная компиляция C ++ Builder приближается к производительности Delphi со скоростью компиляции, поскольку она на порядки быстрее, чем обычная компиляция.C ++ Builder с параллельной компиляцией на современном оборудовании через TwineCompile может приблизить вас к производительности Delphi со скоростью и мощью C ++ для ваших приложений Windows.

Современное оборудование есть, и AMD Ryzen 9 5950x великолепен с его 16 ядрами и 32 потоками, но процессор Ryzen 9 5950x на самом деле трудно достать в настоящий момент. А как насчет использования TwineCompile на более старой машине? На самом деле я использовал i7-3770 с 4 ядрами и 8 потоками в течение последних 8 лет в качестве своего ежедневного драйвера. Технические характеристики этой машины — примерно Intel i7-3770, 16 ГБ ОЗУ, 1 ТБ SSD, Windows 10 Home. Это CPU тест оценка для одной нити 2069 против 3515 на 5950x. Единственное обновление, которое я действительно внес в него за 8 лет, — это установка SSD Samsung 860 EVO 1 ТБ, и это сильно изменило время компиляции. Я снова использовал диспетчер задач DeLuxe и сделал скриншоты обычной компиляции и параллельной компиляции на 8-поточной машине i7-3770. Сначала мы покажем обычную компиляцию в C ++ Builder. Как вы увидите на снимке экрана, для компиляции кода C ++ используется всего около 30% ЦП.

Затем давайте снова посмотрим на машину i7-3770, на этот раз используя C ++ Builder, параллельную компиляцию того же проекта из 128 форм и около 254 000 строк кода. Как вы увидите, на этот раз он задействует все 4 ядра и 8 потоков и использует всю мощность машины для компиляции.

Давайте посмотрим на некоторые цифры из этой машины при синхронной и параллельной компиляции того же проекта 128 form C ++ Builder. Первая диаграмма здесь — это нормальная отладочная сборка C ++ (-O0), приходящаяся на 1023 секунды, по сравнению с параллельной отладочной сборкой C ++ (-O0), приходящая на 170 секунд (в 6 раз быстрее!). Если мы запускаем числа по строкам кода в секунду, мы получаем около 1494 строк кода в секунду, используя параллельный TwineCompile для -O0. Обычная синхронная отладка -O0 компилируется со скоростью 248 строк в секунду.

Вторая диаграмма здесь — это нормальная сборка выпуска C ++ (-O2), поступающая через 935 секунд, по сравнению с сборкой параллельной версии C ++ (-O2), поступающая через 142 секунды (примерно в 6 раз быстрее!). Если мы запустим числа по строкам кода в секунду, мы получим около 1788 строк кода в секунду, используя параллельный TwineCompile для -O2. Обычная синхронная отладочная сборка -O2 требует компиляции со скоростью 271 строку в секунду. Здесь я вижу одну интересную вещь: на машине AMD Ryzen 9 3950x сборки отладки были быстрее, чем сборки выпуска, где, как и на более старой машине, здесь сборки отладки медленные. У меня нет точных цифр, но я предполагаю, что это может быть из-за того, что отладочные сборки больше, чем сборки релизов, и поэтому в игру вступает скорость твердотельного жесткого диска.

Как вы можете видеть, даже на более старом оборудовании параллельная компиляция C ++ Builder обеспечивает ОГРОМНЫЙ прирост производительности с гораздо более быстрым временем компиляции. Если у вас более старая машина, и у вас нет SSD, такого как Samsung 860 EVO, это простое обновление, позволяющее добиться гораздо большей производительности по сравнению с обычным жестким диском. Или, если вы используете более старую машину, которая не является, по крайней мере, четырехъядерным кодом, вы можете выбрать старые четырехъядерные машины по относительно низкой цене.

В любом случае, независимо от используемого оборудования (если оно имеет как минимум 2 ядра), вы увидите значительное увеличение времени компиляции для ваших проектов C ++ при использовании последней версии C ++ Builder с параллельной компиляцией через TwineCompile. В этом сообщении блога мы протестировали последний AMD Ryzen 9 5950x с его 16 ядрами и 32 потоками и убедительно показали, что он может иметь огромное значение для повышения вашей производительности за счет скорости итераций. Относительно большой проект Windows C ++ со 128 формами и более 254 000 строк кода может быть скомпилирован примерно за 30-40 секунд с помощью параллельной компиляции с 16 ядрами и 32 потоками. Это невероятно. На более старой машине, использующей обычную синхронную компиляцию, на один и тот же проект требовалось от ~ 15 минут до ~ 17 минут!

Сейчас прекрасное время, чтобы стать разработчиком C ++ для создания приложений Windows (и iOS) на C ++. Мы видели, как одно ядро ​​на старом оборудовании может занять 60 минут для компиляции проекта C ++ с 1 миллионом строк кода, который теперь занимает всего ~ 2 минуты при параллельной компиляции на современном оборудовании! Параллельная компиляция обеспечивает столь необходимую продуктивность разработки на C ++ без ущерба для скорости и мощности производительности C ++ во время выполнения. C ++ Builder 10.4.1+ — это инструмент, который поможет вам в этом.

Узнайте больше о компиляторе C ++ Builder в Embarcadero DocWiki.

У вас еще нет последней версии C ++ Builder? Взглянуть.

Exit mobile version