кеширование — память стека C ++ и кеш процессора

Я слышал, что данные, помещенные в стек C ++, скорее всего, появляются в кэше процессора.
http://www.gamedev.net/topic/564817-stack-and-cache-question-optimizing-sw-in-c/#entry4617168

«Стек является наиболее эффективным местом для хранения данных, потому что тот же
диапазон адресов памяти используется снова и снова. «

Из-за подразумеваемого порядка операций наиболее часто используемые данные
стек почти наверняка всегда в кеше L1.

Это правда?


Я имею в виду, действительно ли лучше пытаться хранить часто используемые данные в стеке, чем в куче?

4

Решение

Точная реализация стандарта C ++ — это деталь реализации: она варьируется от компилятора к компилятору, от платформы к платформе и т. Д.

Теперь, даже если теоретически вы можете использовать стек разбиения для C ++, в основных реализациях используется непрерывный сегмент памяти (различного размера).

Эта смежность и частое повторное использование действительно легко пожинают плоды кеширования, однако это тоже не панацея. На самом деле, вы также можете создавать искусственные сценарии для отскок кешаЕсли ваш кэш L1 небольшой (32 КБ?) и имеет двустороннюю ассоциативность, то вы можете легко создать сценарий, который требует доступа к кэшу L2. Просто используйте массив размером в 64 КБ в вашем стеке (он достаточно мал, чтобы не взорвать его), а затем неоднократно обращайтесь к данным по 0, 16 КБ, 32 КБ и 48 КБ в цикле: он должен вызывать множество вытеснений и требовать выборки из кэша L2.

Таким образом, на самом деле стек не очень удобен для кэширования, но его использование предсказуемо и хорошо известно. Вы можете получить те же преимущества кеша с помощью специального распределителя (хотя выделение будет немного медленнее).

С другой стороны, у стека есть и другие преимущества и недостатки:

  • недостаток: если вы попытаетесь потреблять слишком много, вы получите переполнение стека.
  • недостаток: если вы перезаписываете массив в стеке, вы можете повредить сам стек, и это отладочный кошмар (он также используется при так называемых атаках с разбивкой стека).
  • Преимущество: C ++ имеет определенные шаблоны (RAII, SBRM), которые используют преимущества стека. Детерминированные «отменные» действия — это удовольствие для программирования.

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

4

Другие решения


По вопросам рекламы [email protected]