Как конвертация VIPT в PIPT работает при выселении L1-> L2 - PullRequest
2 голосов
/ 28 марта 2019

Этот сценарий пришёл мне в голову и кажется немного базовым, но я спрошу.

Таким образом, в L1 есть виртуальный индекс и физический тег, но набор заполняется, поэтому он выселяется.Как контроллер L1 получает полный физический адрес из виртуального индекса и физического тега в L1, чтобы линия могла быть вставлена ​​в L2?Я полагаю, что он может искать комбинацию в TLB, но она кажется медленной, а также может вообще отсутствовать в TLB.Возможно, полный физический адрес из исходного перевода TLB хранится в L1 рядом со строкой кэша?

Это также открывает более широкий вопрос о том, как PMH делает недействительной запись L1, когда она записывает биты доступа в PTE иPDE и тд.Насколько я понимаю, он взаимодействует с кэш-памятью L2 напрямую для физических адресов, но когда он записывает обращенные и измененные биты, а также отправляет RFO, если это необходимо, он должен отражать изменение в копии в L1, если естьодин означает, что он должен знать виртуальный индекс физического адреса.В этом случае, если полный физический адрес также был сохранен в L1, то это дает возможность L2 также иметь возможность его индексировать.

1 Ответ

2 голосов
/ 28 марта 2019

Да, внешние кэши (почти?) Всегда PIPT, а самой памяти явно нужен физический адрес. Поэтому вам нужен физический адрес строки, когда вы отправляете ее в иерархию памяти.


В процессорах Intel кэши VIP1 L1 имеют все биты индекса из части адреса со смещением внутри страницы, поэтому virt = phys, что позволяет избежать проблем с наложением имен. В основном это PIPT, но он по-прежнему может извлекать данные / теги из набора параллельно с поиском TLB битов pagenumber для создания входных данных для компаратора тегов.

Полный физический адрес известен только из индекса + тега L1d, опять же, потому что он ведет себя как PIPT для всего, кроме задержки загрузки.


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

Фактически индексируемый физически помеченный кэш Синоним имеет диаграмму для одного такого VIPT L1d: физический тег расширяется на несколько бит, чтобы полностью доходить до смещения страницы, перекрывая верхний индекс бит .

Хорошее наблюдение, что кэш с обратной записью должен иметь возможность удалять грязные строки задолго после того, как проверка TLB для хранилища была выполнена. В отличие от загрузки, вы все равно не получите результат TLB, если только вы не сохранили его где-то.

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

Другим решением может быть сквозной кэш, поэтому у do всегда есть физический адрес из TLB для отправки с данными, даже если он не восстанавливаемый из тега + индекса кеша. Или для кэшей только для чтения, например кэши инструкций, виртуальность не проблема.


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

Итак, помимо неэффективности, есть также не менее важная проблема, что она вообще не будет работать. : P Может быть, есть какой-то трюк, которого я не знаю, или что-то, чего я пропускаю, но я не думаю, что даже специальный TLB, индексированный обоими способами (phys-> virt и virt-> phys), мог бы работать, потому что множественные отображения разрешена одна и та же физическая страница.


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

Я думаю, что в ранних процессорах RISC часто было 8 тыс. Кешей с прямым отображением.

Но у классического 5-каскадного первого поколения MIPS R2000 (с использованием внешнего SRAM для его L1), по-видимому, был кэш обратной записи PIPT, если диаграмма на этих слайдах помечена как MIPS R2000 верно, показывая 14-битный индекс кэша, берущий несколько бит из номера физической страницы результата TLB. Но он по-прежнему работает с задержкой в ​​2 цикла для нагрузки (1 для генерации адреса на этапе EX, 1 для доступа к кэшу на этапе MEM).

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

Таблица данных MIPS 4300i (вариант MIPS 4200, используемый в Nintendo 64) показывает, что происходит где / когда в 5-ступенчатом конвейере, а некоторые вещи происходят на восходящем или падающем фронте тактовой частоты.позволяя ему делить некоторые вещи на полчаса на сцене.(например, переадресация может работать с первой половины одной стадии до второй половины другой, например, для цели перехода -> выборка инструкций, все еще без необходимости дополнительной фиксации между полуэтапами.)

В любом случае, это показываетРасчет DVA (виртуальный адрес данных) происходит в EX: это регистр + imm16 из lw $t0, 1234($t1).Затем DTLB и DCR (чтение из кэша данных) происходят параллельно в первой половине этапа Data Cache.(Так что это VIPT).DTC (проверка тегов данных) и LA (выравнивание нагрузки, например, сдвиг для LWL / LWR или для LBU для извлечения байта из извлеченного слова) происходят параллельно во 2-й половине этапа.

Так что я до сих порне нашли подтверждения одноцикловой (после расчета адреса) PIPT MIPS.Но это определенное подтверждение того, что VIP-цикл с одним циклом был чем-то особенным.Из Википедии мы знаем, что ее D-кэш имел обратную запись с прямым отображением 8 КБ .

...