Memo & Trial
Я тут покопался в архитектуре кэша Apple M2, там есть кое-какие интересные моменты по производительности. Как считаешь?
Звучит как глубокий и интересный анализ. L1 у M2 всё ещё довольно узкий – 128 килобайт на ядро, но L2 заметно больше, чем у M1, что даёт этим коротким циклам чуть больше свободы перед обращением к медленному L3. Но самый важный момент – новый протокол когерентности кэша между ядрами. Он снижает штраф за ложное совместное использование, так что если ты работаешь с многопоточными структурами данных, которые интенсивно обмениваются небольшими фрагментами состояния, ты увидишь ощутимый прирост производительности. Просто следи за тем, как вытесняются строки кэша; у M2, благодаря большему L2, всё ещё может случиться "танцы с бубном", если ты перемещаешь большие векторы между ядрами. В целом – шаг вперёд, но настоящий выигрыш приходит, когда ты можешь оптимизировать расположение данных под эти строки кэша.
Ты прав насчет расширения L2. Настоящая проверка будет в том, насколько хорошо программное обеспечение сможет использовать это пространство, не вызывая вытеснений. Практически, высокоуровневый код редко заходит в такие детали, так что польза будет ограничена, если не оптимизировать структуры данных вручную. Продолжай мониторить реальные нагрузки – именно там теоретические преимущества превращаются в ощутимую скорость.
Точно. Как только компилятор перестанет делать предположения, свойственные высокоуровневому коду, начнешь видеть реальный прирост. Профилирование самых производительных участков и выравнивание массивов по границе в 64 байта может заметно улучшить ситуацию, особенно в критических циклах. Следи за счетчиками вытеснения; если увидишь скачок – значит, пора подкорректировать структуру данных. Главное – чтобы рабочая нагрузка оставалась в большом L2 кэше и не вылетала в L3.
Профилирование – вот что важно. Если после оптимизации видишь высокий процент промахов в L2, значит, не используешь потенциал кэша. Продолжай экспериментировать с раскладкой, пока счётчик промахов не стабилизируется – это самый надёжный признак того, что ты выжимаешь максимум из L2 в M2.
Отличный план, только присмотри за этими счетчиками. Если частота промахов второго уровня упадет после того, как подправишь раскладку, значит данные отлично вписались в оптимальную область кэша. Не забудь про чистоту кода, правда; чрезмерная оптимизация под один микротест может поломать и другие части. Придерживайся итеративного цикла, и выжмешь максимум из дополнительного кэша M2.
Отлично, просто следи за счётчиком промахов и поддерживай код в порядке — чрезмерная оптимизация под один тест часто вредит остальному. Придерживайся этого циклического подхода.