методы оптимизации производительности, связанные с кешем?

есть много шума о проблемах с производительностью, связанных с кешем. У меня к ним несколько вопросов:

  1. Вероятно, самые популярные проблемы - это расположение кеша и ложное совместное использование кеша. Любые другие?
  2. какой-нибудь хороший обзор?
  3. есть ли проверенные методы борьбы с ними?
  4. каковы общие характеристики приложений, в которых возникают реальные проблемы? вычислительные области (математика / обработка изображений и т. д.)? высокопараллельные приложения?

person Andriy Tylychko    schedule 13.02.2011    source источник
comment
выравнивание циклов относительно строк кэша может помочь, зависит от коллизий и выселений. нечасто используемые, но повторно используемые элементы, которые говорят, что занимают две строки кеша, но могли уместиться в одну, стоили вам вдвое больше времени выборки, получая 8 слов при каждом выполнении вместо, скажем, 2 или 3. Чтобы увидеть это в действии, добавьте или удалите один, затем два, а затем три nops в начале .text, чтобы принудительно изменить выравнивание всей программы, затем наблюдайте за изменением вашей производительности.   -  person old_timer    schedule 14.02.2011


Ответы (1)


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

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

Вам просто нужен глобальный анализ: -} Во-первых, я прочитал об этом, optimizatoin фактически был реализован как часть компоновщика, что является одним из способов получить доступ ко всей программе.

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

person Ira Baxter    schedule 13.02.2011