Разные кэши могут обладать разным количеством портов. Фактически, их
необходимое количество зависит от функциональных устройств процессора и числа их
конвейеров. Обычная однопортовая кэш-память в состоянии обслужить один запрос на
чтение или запись за такт. Что касается D-cache, то однопортовая реализация
может быть приемлемой лишь для простого дизайна с одним или двумя
исполнительными конвейерами. Большее количество конвейеров потребует большего
количества данных для эффективной работы, а перспектива остановки какого-либо
конвейера по причине несвоевременной доставки данных из D-cache мало привлекает.
В то же время, добавление ещё одного порта является сложной задачей, которая
может потребовать основательной перепроектировки подсистемы кэш-памяти.
Продолжим на примере. Рассмотрим суперскалярный RISC-процессор с 4
целочисленными исполнительными конвейерами (2 из которых в состоянии проводить
расчёт виртуальных адресов) и 2 вещественными исполнительными конвейерами
— DEC Alpha 21264. Выборка большинства инструкций на исполнительные
конвейеры может быть осуществлена в течение одного такта, что предполагает
максимальную нагрузку на I-cache и D-cache. Поскольку Alpha является
RISC-архитектурой с командами фиксированной длины по 4 байта, параллельное и
упреждающее декодирование команд может быть реализовано без особых проблем, что
выгодно отличает её от CISC-архитектур в целом и x86 в частности. В общем,
команды загрузки/сохранения составляют от 20% до 50% от общего потока команд,
также наблюдается соотношение в виде 2 операндов загрузки на 1 операнд
сохранения. Таким образом, коммерчески привлекательная конфигурация должна
включать поддержку не менее 2 портов чтения для D-cache, а также весьма
желательна возможность параллельного обслуживания хотя бы 1 запроса чтения при
1 запросе записи. Вопрос в том, как этого достичь?
Существует несколько способов организации многопортовых кэшей:
- идеальная многопортовость (ideal multiporting);
- временное уплотнение (time division multiplexing);
- зеркалирование (клонирование) (mirroring, cloning);
- чередование (interleaving).
Идеальная многопортовость предполагает нестандартную структуру ячеек
кэш-памяти. В то время как обычная 1-портовая ячейка статической памяти
состоит из 6 полевых транзисторов, для 2-портовой реализации потребуются
дополнительные 2 транзистора. Такие 2-портовые ячейки являются более дорогими в
производстве и не столь быстрыми, как 1-портовые. Ко всему прочему, они
характеризуются более высоким энергопотреблением.
Временное уплотнение можно сравнить с разгоном кэш-памяти. Другими словами,
если заставить кэш-память работать с удвоенной (утроенной, учетверённой)
частотой процессора, то она будет в состоянии обслужить 2 (3, 4) запроса за один
такт процессора. Хотя такая кэш-память и будет оставаться 1-портовой физически,
её производительность будет соответствовать 2-портовой (3-портовой, 4-портовой)
идеальной релаизации. Например, DEC Alpha 21264 обладает 64Кб D-cache, которая
работает с удвоенной частотой процессора. Этот подход не увеличивает
производственных затрат, но требует значительно более серьёзных инженерных
усилий вследствие усложнённого электрического и температурного менеджмента. Не
является секретом тот факт, что энергопотребление возрастает линейно с тактовой
частотой при постоянном напряжении.
Зеркалирование (клонирование) предусматривает использование 2 (3, 4)
одинаковых кэшей. Это означает, что они характеризуются тем же размером,
устройством и хранят одну и ту же информацию. Этот подход позволяет получить 2
(3, 4) порта чтения, поскольку каждая кэш-часть может быть опрошена независимо
от других. Однако, имеется лишь один порт записи, так как запись во все
кэш-части происходит одновременно. Другим нежелательным фактором является
невозможность чтения при осуществлении записи, так как каждая кэш-часть обладает
только одним физическим портом, хотя теоретически существует возможность
минимизации этого недостатка при наделении каждой кэш-части собственным буфером
отложенной записи (delayed write buffer). В частности, DEC Alpha 21164 обладает
8Кб D-cache, состоящим физически из двух одинаковых 8Кб частей. Зеркалирование
(клонирование) не представляет особых сложностей с инженерной точки зрения, но
этот подход наименее привлекателен с точки зрения производственных затрат.
Фактически, только небольшие кэши могут быть зеркалированы (клонированы).
Чередование основывается на логической сегментации кэш-памяти. Если имеется
в наличии несколько сегментов, то должно быть возможно организовать их
параллельный опрос. Например, MIPS R10000 обладает 32Кб D-cache с 2-канальной
ассоциативностью, который поддерживает 2-канальное чередование. Это решение
почти не отражается на производственных затратах, также не является сложным с
инженерной точки зрения. Однако, на эффективность этого метода оказывают
значительное влияние сегментные конфликты. Если два или более запроса
направляются в один и тот же сегмент, то они будут обработаны последовательно,
так как каждый сегмент обладает одним физическим портом.
Конечно же, все вышеперечисленные техники могут быть совмещены в конкретно
взятых разработках. Хотя реальность такова, что промышленно производимые
2-портовые микросхемы статической памяти по сравнению с 1-портовыми при
одинаковом технологическом процессе оказываются до 50% медленнее и/или до 120%
потребляют больше энергии и/или до 150% занимают больше площади кремниевой
подложки.