Выровняется ли выравнивание памяти в кеш-памяти?

Я просто знаю основные идеи о выровненном распределении памяти. Но я не заботился о проблемах с выравниванием, потому что я не программист по сборке, также не имел опыта работы с MMX/SIMD. И я думаю, что это одна из досрочных оптимизаций.

В эти дни люди все больше говорят о кеш-хите, кеш-когерентности, оптимизации размера и т.д. Некоторые исходные коды даже выделяют память, явно выровненную по строкам кэша CPU.

Честно говоря, я не знаю, насколько размер строки кеша моего процессора i7. Я знаю, что не будет никакого вреда с выравниванием большого размера. Но действительно ли это окупится, без SIMD?

Скажем, там 100000 элементов из 100 байтов данных в программе. И доступ к этим данным является наиболее интенсивной работой программы.

Если мы изменим структуру данных и сделаем все данные размером 100 байтов, выровненными на 16 байт, можно ли получить заметное увеличение производительности? 10%? 5%?

Ответ 1

Большинство обсуждений по выравниванию строк в кешках относятся к высокопроизводительным вычислениям, работающим со многими потоками, и сохраняя масштабируемость как можно более близкой к линейной. В этих обсуждениях причина выравнивания строки кэша заключается в том, чтобы предотвратить запись в одну переменную данных, недействительную строку кэша, которая также содержит другую переменную, используемую другим потоком.

Итак, если вы не пытаетесь написать код, который будет масштабироваться до очень большого количества процессорных ядер, выравнивание строки в строке, вероятно, не имеет большого значения для вас. но еще раз проверьте его и посмотрите.

Ответ 3

Оптимизация кеша оплачивается даже для монохромного приложения. Но оптимизация кеша не обязательно выравнивает данные в начале кеша, так как есть несколько факторов, которые необходимо учитывать. Итак, путь:

  • Вы отвечаете требованиям своей производительности? Если да, зачем тратить время на оптимизацию. Оптимизация ради оптимизации оплаты редко.

  • Измерьте, где ваше узкое место. Если вы подозреваете проблемы с кешем, используйте инструмент, который сообщает о пропуске кеша, и поэтому получите представление о том, сколько вы могли выиграть.

На самом высоком уровне цель оптимизации кеша состоит в том, чтобы заполнить ваш кеш интересными данными, сохранив из него не интересные данные. Если вы выполняете многопоточное программирование, важно также предотвращать помехи между потоками. Затем вы также должны предотвращать некоторые вещи, специфичные для реализации некоторых кешей, такие как резонансные эффекты, которые иногда уменьшают размер кеша эффекта для не полностью ассоциативного кеша.

Ответ 4

Это зависит от вашей системы. Попробуйте, запустите некоторые тесты и узнайте.