Проблемы с кэшированием длинных массивов
Недавно я заметил, что сканирование длинных массивов с помощью цикла уменьшает производительность кэширования. Не могли бы вы, ребята, объяснить, почему это происходит и как обойти эту проблему. Я работаю на платформе Linux с C/C++
1 ответ
Это классическая проблема кэширования: если вы перебираете достаточно большой массив, каждая ссылка на память относится к элементу, который уже был очищен, и, следовательно, требует, чтобы элемент был извлечен из ОЗУ в кэш. В самом простом сценарии вам нужен только доступ к массиву, который на один байт больше вашего кэша, чтобы увидеть это.
Этому вопросу подвержены даже сложные, прогнозирующие схемы извлечения. Независимо от схемы кэширования всегда можно разработать шаблон выборки, который приведет к ошибке проверки кэша при каждом обращении к памяти.
Хорошей новостью является то, что современные системы кэширования прилагают все усилия, чтобы уменьшить влияние этого. Например, система, которую вы используете, вероятно, выполняет некоторую прямую выборку в ваших больших массивах, поэтому она не дает сбоя при каждом доступе к памяти. В конце концов, потратив некоторое время на понимание систем кэширования, возможно, просмотр ваших заметок из класса архитектуры, в котором вы спали в старших классах:-), поможет вам работать с системой кэширования.