#### Причины кэш-промахов. Уменьшение частоты промахов: дополнительный кэш «жертв», разделение кэша прямого доступа на 2 части, программная предвыборка данных, аппаратная предвыборка команд и данных. **Причины кэш промахов:** 1) **Вынужденный** При первом обращении к блоку. Блок должен быть помещен в кэш. Также называется промах холодного старта или промах первого обращения. При запуске программы miss rate $~ 100\%$. Решаются увеличением объема блока и предвыборкой. 2) **Ограниченная емкость** В случае, когда кэш не может вместить все блоки, востребованные кодом, и возникает «перетасовка» блоков (рабочий набор много больше емкости кэша). Решается увеличением объема кэша. 3) **Конфликты** В наборно-ассоциативном или кэше с прямым отображением стратегия размещения блоков вызывает конкуренцию нескольких блоков за одну строку кэша; Также называется промахом из-за коллизий или интерференции. **Способ совместить низкое время доступа кэша с прямым отображением и низкую частоту промахов из-за конфликтов 2-х канального наборно-ассоциативного кэша:** - Разделим кэш. При промахе проверяем вторую половину кэша, если теперь происходит попадание, то это - «псевдо-попадание» (медленнее нормального). - Недостаток: согласование конвейера CPU с переменной задержкой доступа в кэш ( 1 или 2 такта)Лучше для кэша, не связанного непосредственно с CPU (L2). - Процессор может анализировать шаблон обращения к памяти и может пытаться предсказать адреса, по которым будет обращение к памяти в ближайшее время. Процессор сам инициирует доп. обращение к памяти, выполняя спекулятивную загрузку данных. **Уменьшаем частоту промахов с помощью программной предвыборки данных:** - Загрузка данных в регистры. - Предвыборка в кэш. - Спец. команды предвыборки, не вызывающие сбоев; разновидность спекулятивности. - Обработка команд отнимает время. Время на обработку команд предвыборки должно оправдываться сокращением промахов. - Высокий уровень суперскалярности снижает «цену» выдачи доп. команд и одновременно повышает «цену» промахов кэша. **Уменьшаем частоту промахов с помощью программной оптимизации компилятором:** **Инструкции:** - Расположение процедур в памяти так, чтобы сократить промахи из-за конфликтов. - Профилирование для обнаружения конфликтов (используя собственное ПО). **Данные:** - Слияние массивов: увеличение пространственной локальности объединением нескольких массивов в 1 - Согласование вложенности циклов: согласование уровня вложенности циклов для обработки в соответствии с порядком хранения данных в памяти - Слияние циклов: составление из независимых циклов, обрабатывающих одни данные, общего. - Поблочная обработка массивов: улучшение временной локальности за счет повторной обработки блоков данных вместо полного обхода по строкам и столбцам.