Как кеш процессора обрабатывает большие объекты памяти?

Scenario:

  • Cache (L1) size (CS): 32kB
  • Line size (LS): 64B
  • Associativity (A): 8
  • Set size (SS): 512B (A * LS)
  • Sets (S): 64 (C/SS)
  • Read/written object (O) has size greater than LS

Assumptions (correct me if invalid):

  • Блоки виртуальной памяти (размером 4kB ( SS * A ), обозначенные как B ), сопоставляются по модулю с подобными настройками. Другими словами, адреса 0x0: 0xFFFF (индекс блока ( BI ) 0) сопоставляются для установки 0, 0x1000: 0x1FFF ( BI 1) отображаются в 1 и т. Д.
  • Запрос на чтение/запись (не используются временные записи/чтения), для данного адреса A требуется найти его BI , а затем переместить его в назначенный набор. Например, A = 0x4600A будет иметь BI = 70. Этот BI отображается для установки 6 ( BI % S ).
  • Для правильного (без смещения) r/w объекта ( O ) для кэширования требуется выравнивание LS .

Questions:

  1. Will the O be serially aligned in the cache or it can take (for instance) free slots 0 & 4 & 5, instead of 0 & 1 & 2?
  2. What is the cost (penalty) of retrieving partitioned O from cache? Assume that the O isn't partitioned across several B.
  3. The same question as above, but in case when O is placed in two B, thus two sets are used.
  4. What will happen if the O size is larger than the SS (512B)? Will it move the data to L2 and step-by-step move data to L1? Will it use other sets?
  5. What if L2 (and L3 for that matter) is too small for all the data?
3
nl ja de
И как это связано с C ++ 11?
добавлено автор Bartek Banachewicz, источник
Гм. Звучит как много как преждевременная оптимизация.
добавлено автор Bartek Banachewicz, источник
@BartekBanachewicz Главным образом из-за alignas() , который обеспечивает простой и стандартизированный доступ к манипуляциям выравнивания. Когда вы начинаете выравнивание данных для оптимизации производительности кеша, я считаю, что естественно запрашивать стоимость кэширования больших объектов.
добавлено автор Red XIII, источник
@BartekBanachewicz Итак, любая оптимизация нижнего уровня считается преждевременной? Я не говорю и говорю: смотрите, ребята, это определенно узкое место в производительности моего кода! Основываясь на моем предыдущем опыте, правильное использование кеша дает БОЛЬШОЕ повышение производительности, поэтому я не понимаю, почему этот вопрос не имеет отношения к общей оптимизации программ.
добавлено автор Red XIII, источник

1 ответы

Блоки виртуальной памяти (размером 4kB (SS * A), обозначенные как B), отображаются   по модулоподобной манере. Другими словами, адреса 0x0: 0xFFFF   (индекс блока (BI) 0) отображаются в 0, 0x1000: 0x1FFF (BI 1) являются   отображается на 1 и т. д.

Transfer between L1 cache and the memory hierarchy: the transfer unit between the L1 cache and the following level of the memory hierarchy is a block of line size (LS) bytes. That is, to your L1 cache, memory is structured in 64 bytes blocks (LS bytes).

Correspondence between memory blocks and cache entries: consecutive memory blocks are mapped to cache lines of consecutive sets. Hence, block 0 (addresses 0x0000 : 0x003F) is mapped to a cache line at set 0, block 1 (addresses 0x0040 : 0x007F) is mapped to a cache line at set 1, and so forth.


Запрос на чтение/запись (не используются временные записи/чтения) a   для данного адреса A требуется найти его BI, а затем переместить его на   назначенный набор. Например, A = 0x4600A будет иметь BI = 70. Это BI   для отображения 6 (BI% S).

Правильная процедура поиска идентификатора блока (или индекса) и заданного индекса (SI) заключается в следующем:

 BI = A >> LS = 0x4600A >> 6 = 0x1180
 SI = BI & (S-1) = 0x1180 & 0x3F = 0x0000
 (when S is a power of two, BI & (S-1) = BI  mod S)

Для правильного (без смещения) r/w объект (O) -   кеш, требуется выравнивание LS.

Это не обязательно. O не обязательно должен быть выровнен по блоку.


Q1. Will the O be serially aligned in the cache or it can take (for instance) free slots 0 & 4 & 5, instead of 0 & 1 & 2?

O blocks will be stored in consecutive sets with cache line granularity (set k, k+1, …, S-1, 0, 1, …) .

<Р> Q2. Какова стоимость (штраф) за извлечение секционированного O из кеша?   Предположим, что O не разбивается на несколько B.   Q3. Тот же вопрос, что и выше, но в случае, когда O помещается в два B,   таким образом, используются два набора.

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

<Р> Q4. Что произойдет, если размер O больше, чем SS (512B)? Будет   он перемещает данные в L2 и пошаговые данные перемещения в L1? Будет ли он использовать   другие наборы?

     <Р> Q5. Что, если L2 (и L3, если на то пошло) слишком мала для всех данных?

Если блок должен быть выделен для набора без свободных строк кэша, необходимо выбрать блок для высылки (блок жертвы). Политика замены выбирает блок жертвы в соответствии с алгоритмом (LRU, pLRU, случайный).

1
добавлено
Я не могу голосовать в любом случае, так как эта тема выходит из моей глубины, но я бы хотел, чтобы у SO было больше вопросов и ответов, как этот. Вербальный +1 пока.
добавлено автор deceze, источник