Урок 15: кэш CPU и локальность памяти
CPU намного быстрее основной памяти. Чтобы преодолеть этот разрыв, он использует иерархию кэша — L1, L2, L3 — храня копии недавно использованных данных. Когда код на C++ обращается к данным в дружественном для кэша порядке, производительность может вырасти в 10–50 раз. В этом уроке мы увидим, почему
CPU запоминает то, к чему вы обращались недавно — читайте данные в том порядке, в котором они лежат в памяти, и CPU подготовит следующий кусок ещё до того, как вы его запросите.
- cache line
- Единица передачи между основной памятью и кэшем — 64 байта на большинстве современных CPU. Любое обращение к памяти загружает целую cache line, содержащую этот адрес.
- false sharing
- Ситуация, когда два threads пишут в разные переменные, находящиеся в одной cache line, вызывая ненужную инвалидацию кэша в каждом thread.
- пространственная локальность
- Склонность программ обращаться к близко расположенным адресам памяти. Последовательный доступ к массиву использует пространственную локальность, потому что вся cache line загружается за один раз.
- временная локальность
- Склонность программ обращаться к одному и тому же адресу памяти многократно за короткое время. Циклы, которые повторно используют одну и ту же переменную, используют временную локальность.
- prefetch
- Механизм, при котором CPU (или компилятор) загружает cache lines заранее, до того как код их запросит, распознавая последовательные шаблоны доступа.