14 October 2022

Многоядерность: компиляция и декомпрессия

После апгрейда начала этого многострадального года, когда я переехал с 4х ядерного процессора на 10 ядер, периодически ловлю себя на мысли, что я оказался в ситуации чувака, который купил себе sports car, чтобы каждый день стоять на нем в городских пробках. При казуальных сценариях использования ПК дома хоть какую-то серьезную нагрузку на процессор дают ну разве что игры. При этом для современных многоядерных камней речь идет о нагрузке порядка 30-40%, т.е. две трети мощностей тупо простаивает. Как по мне, для гейминга оптимум по процессору находится где-то в области нынешних бюджетных решений со схемой 4C/8T (при условии, что эти ядра будут работать на достаточно высоких частотах)... 
Да, на моем i5-12600K есть возможность выбивать красивые цифры во всякой там синтетике, типа Cinebench, но синтетика она и есть синтетика и постепенно приходит осознание, что у тебя в ПК стоит процессор, которому вообще-то место не дома, а на рабочем месте в машинах класса "workstation". Короче, в один прекрасный день, наблюдая за тем, как неторопливо идет компиляция проекта на моем ноутбуке для работы (с не самым дохлым i7-10850H), я понял, что мне определенно стоит попробовать стоящий рядом домашний ПК в роли рабочей лошадки. 

Наконец-то дошли руки поставить Visual Studio 2022, а в качестве real-world бенчмарка решено было использовать компиляцию boost (достаточно большую по размеру и сверх популярную C++ библиотеку). Скачал последнюю актуальную версию 1.80, это целых 200 мегабайт исходников. 

Перед тем, как показывать и обсуждать какие-то цифры, напомню, что в одной из прошлых заметок я поделился выводами о том, как нужно оценивать многопоточный потенциал процессора i5-12600K с учетом того, что он содержит в себе аж целых три разных вида ядер -- производительные P-ядра, их виртуальных копии для режима hyperthreading и "экономичные" E-ядра. Многочисленные бенчмарки говорят о том, что для хорошо масштабирующейся нагрузки этот процессор можно интерпретировать как содержащий 10 P-ядер: 6 фактических, +2 ядра дают 6 HT ядер (с коэффициентом 1 к 3) и +2 ядра дают 4 E-cores (с коэффициентом 1/2). Т.е. если какая задача, при переходе от выполнения на одном ядре к работе на всех 16-ти ядрах, ускоряется в 10 раз, то можно говорить о том, что она практически идеально масштабируется под многопоточность.