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