Как кэши данных маршрутизируют объект в этом примере? - PullRequest
0 голосов
/ 11 февраля 2019

Рассмотрим схематическую архитектуру кеша данных.(Искусство ASCII следует.)

  --------------------------------------
  | CPU core A | CPU core B |          |
  |------------|------------| Devices  |
  |  Cache A1  |  Cache B1  | with DMA |
  |-------------------------|          |
  |         Cache 2         |          |
  |------------------------------------|
  |                RAM                 |
  --------------------------------------

Предположим, что

  • объект затенен на грязной строке кэша A1,
  • более старая версия того же объекта затеняется в строке clean в Cache 2, а
  • самая последняя версия того же объекта была недавно записана в RAM через DMA.

Диаграмма:

  --------------------------------------
  | CPU core A | CPU core B |          |
  |------------|------------| Devices  |
  |  (dirty)   |            | with DMA |
  |-------------------------|          |
  |     (older, clean)      |          |
  |------------------------------------|
  |          (newest, via DMA)         |
  --------------------------------------

Три вопроса, пожалуйста.

  1. Если процессорное ядро ​​A пытается загрузить (прочитать) объект, что происходит?

  2. Если вместо этого ядро ​​ЦП A попытается сохранить (записать) объект, что произойдет?

  3. Было бы что-то неочевидное, интересное и / илииначе случится, если вместо ядра А ядро ​​В загрузит или сохранит?

Мои вопросы теоретические.Мои вопросы не относятся к какой-либо конкретной архитектуре процессора, но вы можете сослаться на x86 или ARM (или даже RISC-V) в своем ответе, если хотите.

Примечания. Если игнорирование отслеживания будетупростите свой ответ, тогда вы можете игнорировать слежку по своему усмотрению.Кроме того, вы можете изменить проблему, если, по вашему мнению, измененная проблема лучше осветит тему.Если вы должны написать код для ответа, то я бы предпочел C / C ++.Насколько мне известно, вам не нужно указывать конкретные флаги протокола MESI или MOESI в вашем ответе, но более простого, менее подробного ответа, вероятно, будет достаточно.

Мотив. Мой мотив спросить - я читаю о параллелизме и модели памяти в стандарте C ++.Я хотел бы научиться визуализировать эту модель примерно с точки зрения аппаратных операций, если это возможно.

ОБНОВЛЕНИЕ

В той степени, в которой я понимаю, @HadiBrais рекомендует, чтобыследующая схематичная архитектура будет более обычной, чем та, которую я ранее изображал, особенно если реализован DDIO (см. его ответ ниже).

  --------------------------------------
  | CPU core A | CPU core B | Devices  |
  |------------|------------| with DMA |
  |  Cache A1  |  Cache B1  |          |
  |------------------------------------|
  |              Cache 2               |
  |------------------------------------|
  |                RAM                 |
  --------------------------------------

1 Ответ

0 голосов
/ 12 февраля 2019

Кажется, что ваша гипотетическая система включает в себя когерентные кэши L1 с обратной записью и некогерентные DMA.Очень похожим реальным процессором является ARM11 MPCore , за исключением того, что он не имеет кэш-памяти L2.Однако большинство современных процессоров имеют согласованный DMA.В противном случае ответственность за обеспечение согласованности лежит на программном обеспечении.Состояние системы, как показано на вашей диаграмме, уже является непоследовательным.

Если процессорное ядро ​​A пытается загрузить (прочитать) объект, что произойдет?

Это будетпросто прочитайте строку, хранящуюся в ее локальном кэше L1.Никаких изменений не произойдет.

Если вместо этого ядро ​​ЦП А попытается сохранить (записать) объект, что произойдет?

Строки уже находятся в согласованности Мсостояние в кеше L1 ядра A. Таким образом, он может записывать в него напрямую.Никаких изменений не произойдет.

Произойдет ли что-нибудь неочевидное, интересное и / или иное, если вместо ядра A ядро ​​B загрузит или сохранит?

Если ядроB отправил запрос на загрузку в ту же строку, кэш L1 ядра A отслеживается, и строка находится в состоянии M.Строка обновляется в кэше L2 и отправляется в кэш L1 ядра B. Также будет выполнено одно из следующих действий:

  • Строка недействительна из кэша L1 ядра A.Линия вставляется в кэш L1 ядра B в состоянии E-когерентности (в случае протокола MESI) или в состоянии S-когерентности (в случае протокола MSI).Если L2 использует отслеживающий фильтр, фильтр обновляется, чтобы указать, что ядро ​​B имеет линию в состоянии E / S.В противном случае состояние линии в L2 будет таким же, как и в ядре L1 ядра B, за исключением того, что он не знает, что он там есть (поэтому отслеживание будет передаваться всегда).
  • Состояниестроки в кеше L1 ядра A изменяется на S. Строка вставляется в кэш L1 ядра B в состоянии S-когерентности.L2 вставляет строку в состояние S.

В любом случае, и кэш-память L1, и кэш-память L2 будут содержать одну и ту же копию строки, которая остается несовместимой с копией в памяти.

Если ядро ​​B отправило запрос на сохранение в ту же строку, строка будет признана недействительной из кэша ядра A и окажется в состоянии M в кэше ядра B.

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

  • Строка находится в состоянии S / E, поэтому она будет просто отброшена из всех кэшей.Позже, если строка будет прочитана снова, копия, записанная операцией DMA, будет считана из основной памяти.
  • Строка находится в состоянии M, поэтому она будет записана обратно в основную память и (возможно, частично) перезаписать копию, записанную операцией DMA.

Очевидно, что такое некогерентное состояние никогда не должно возникать.Это можно предотвратить, сделав недействительной всю соответствующую строку из всех кэшей до того, как начнется операция записи DMA, и убедившись, что ни одно ядро ​​не получит доступ к области памяти, в которую производится запись, до завершения операции.Контроллер DMA отправляет прерывание всякий раз, когда операция завершается.В случае операции чтения DMA все соответствующие строки необходимо записать обратно в память, чтобы обеспечить использование самых последних значений.

Intel Data Direct I / O (DDIO)Технология позволяет контроллеру DMA считывать или записывать данные напрямую из общего кэша последнего уровня для повышения производительности.


Этот раздел не имеет прямого отношения к вопросу, но я хочу написать это где-нибудь.

Все коммерческие процессоры x86 полностью согласованы с кэшем (т. Е. Вся иерархия кэша согласована).Чтобы быть более точным, все процессоры в одной и той же области разделяемой памяти являются когерентными.Кроме того, все коммерческие многоядерные сопроцессоры x86 (т.е. Intel Xeon Phi в виде карты PCIe) внутренне полностью согласованы.Сопроцессор, который является устройством в соединении PCIe, не связан с другими сопроцессорами или процессорами.Таким образом, сопроцессор находится в отдельной области когерентности.Я думаю, это потому, что не существует встроенного аппаратного механизма для создания устройства PCIe, которое имеет кэш, согласованный с другими устройствами PCIe или процессорами.

Помимо коммерческих чипов x86, существуют прототипы чипов x86, которые неКэш связный.Единственный пример, который мне известен, - это однокристальный облачный компьютер Intel (SCC), который впоследствии превратился в целостный Xeon Phi.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...