Одним из наиболее интересных из них является избегание коллизий кеша.Если вы знаете схему доступа к памяти, вы можете расположить элементы, к которым осуществляется доступ, таким образом, чтобы минимизировать коллизии между строками кэша между данными, к которым осуществляется доступ.Вы можете сделать это для данных и кода.
Определить шаблоны доступа к данным довольно сложно, но вы можете относительно легко определить шаблоны доступа к коду.Учитывая граф вызовов, наборы блоков, которые составляют тела функций, и некоторые оценки частот перехода между блоками, вы можете назначить кодовые блоки кешу таким образом, чтобы максимально увеличить вероятность того, что следующий блок вам понадобитсянаходиться в какой-то другой строке кэша, которая не конфликтует с текущей.Одна интересная идея состояла в том, что вам нужно было только назначить блоки кода, которые были «горячими» (высокая вероятность выполнения);не имеет большого значения, куда вы положили холодные.IIRC, это означает, что вы можете отсортировать блоки по частоте вероятного выполнения, а затем назначить их в этом порядке.
Вам просто нужен глобальный анализ: -} Первое место, где я читал об этом, на самом деле был оптимизированреализованный как часть компоновщика, который является одним из способов получить всю программу в целом.
Я не помню ни одного хорошего обзора или набора собранных приемов.Тем не менее, конференции PLDI, как правило, публикуют исследовательские работы по этой теме.