Спроектируйте стратегию кеширования уровней L1/L2/L3 для многоядерного процессора с общей памятью: какие алгоритмы замещения и согласования кэша вы бы предложили и почему, как учесть ложное совместное использование (false sharing)

20 Ноя в 08:42
3 +2
0
Ответы
1
Кратко: предложенная схема — приватные L1 (split I/D, низкая латентность), приватные/частично-приватные L2 (кластер/ядро) и общий L3 (LLC) с directory‑coherence для большого числа ядер; замещать на L1 — простая pseudo‑LRU, на L2 — адаптивные RRIP/DRRIP + потоковые вставки, на L3 — динамическое разделение/DRRIP с политиками защиты от интерференции; для согласования — MESI/MOESI + directory (или snoop+MESIF для малых систем) с оптимизациями; ложное совместное использование — предотвращать/смягчать через субблокирование, детекцию и софт‑правила (выравнивание/паддинг). Ниже — обоснование и детали.
1) Архитектура уровней (рекомендуемая роль)
- L1: приватный на ядро, split I/D, write‑back + write‑allocate, минимальная латентность. Типичные параметры: L1d=32 KBL1_d = 32\ \text{KB}L1d =32 KB, line =64 B=64\ \text{B}=64 B, associativity =8=8=8.
- L2: приватный или частично привязанный к кластеру (ядро/SM), средняя латентность, кэш побольше для сглаживания локальной повторной пользы.
- L3 (LLC): общий, большой, служит как directory (или хранит directory отдельно). Обычно большой ассоциативный кэш, не обязательно включающий (inclusive/non‑inclusive trade‑off объяснён ниже).
2) Политики замещения и вставки
- L1 (маленький, низкая латентность)
- Замещение: pseudo‑LRU (tree‑PLRU) или true LRU если associativity мала — дешёвая аппаратная реализация и хорошая локальность. Обоснование: простота и низкий overhead.
- Вставка: по умолчанию MRU/near‑MRU для повторного использования.
- L2 (середина)
- Замещение: SRRIP/BRRIP или DRRIP (adaptive RRIP). Эти политики хорошо справляются с потоковыми и повторно используемыми данными.
- Вставка: bimodal insertion (малый процент вставок с long re‑reference interval) для борьбы с потоками больших одноразовых блоков.
- L3 (общий, конкуренция между ядрами)
- Замещение: DRRIP с set‑sampling и адаптацией на уровне ядра; дополнительно utility‑based partitioning (UBP) или динамическое разделение (например, UCP, Intel CAT‑style) для предотвращения межъядерной интерференции.
- Вставка/бездействие: возможность bypass для чисто стриминговых потоков (non‑allocating loads / non‑temporal stores) — не загрязнять LLC.
- Механизм выборки/выделения: выборочные структуры (signature‑based sampled sets) для оценки полезности и принятия решений о выделении мест.
3) Согласование кеша (coherence)
- Для малого числа ядер (например, ≤8 \le 88): snooping + MESI/MESIF/MOESI; MESIF полезен — есть Forward (F) для сокращения широковещательных ответов.
- Для большого числа ядер (масштабируемость): directory‑based coherence (каждая строка в LLC или отдельной директории хранит sharer info). Реализации:
- Full bitmap sharer (если число ядер невелико).
- Sparse/limited sharer list + overflow (чтобы экономить память) или hashed directory / distributed directory для масштабирования.
- Стандартные состояния: MESI/MOESI; MOESI полезно для передачи dirty данных без writeback в память (Owner state).
- Оптимизации:
- Forwarding в LLC (llc служит как forwarder/owner).
- Snoop filtering (sig‑based) — уменьшает ненужные snoops.
- Silent drops, transient states и write combining в контроллере для уменьшения трафика.
- Writeback on eviction, а не write‑through, чтобы снизить трафик (с учётом owner state).
4) Борьба с ложным совместным использованием (false sharing)
- Аппаратные подходы:
- Sub‑blocking / sector caches: разбивать линию 64 B64\ \text{B}64 B на меньшие подблоки (например, 16 B16\ \text{B}16 B или 8 B8\ \text{B}8 B) с отдельными dirty/valid битами. Это уменьшает ненужные инвалидирования, но усложняет хард.
- Word‑level coherence или “byte‐addressable” dirty bits для активных линий.
- Dynamic line granularity: если наблюдается частое несовпадающее обращение внутри линии — переключиться на более мелкие блоки.
- Replication for read‑heavy false sharing: если много ядер читают разные слова в одной линии, можно держать реплики (read only) и разрешать локальные чтения, а write → ownership transfer.
- Hardware false‑sharing detector: счётчики invalidations per line / per PC; при превышении порога — сигнал ОС/компилятору или аппаратное изменение стратегии (subblock, migrate owner).
- Программные/компиляторные меры:
- Паддинг/выравнивание: выравнивать или добавлять padding между часто записываемыми полями/структурами (использовать минимум 64 B64\ \text{B}64 B или размер линии).
- Переразмещение полей/агрегация hot/warm variables по потокам.
- Применять per‑thread buffers или batching обновлений и уменьшать частоту синхронизаций.
- Использовать atomics/lock‑free структуры, которые минимизируют частые записи в одну линию.
- Динамическое восстановление:
- Мониторить счётчики (шумные линии) и автоматически мигрировать объект в память, где он обслуживается одним ядром (owner migration), либо реплицировать.
- Инструменты трассировки, профилировщики false‑sharing (sampling) и рекомендации компилятору/программисту.
5) Трейд‑оффы и практические рекомендации
- Inclusive vs non‑inclusive LLC:
- Inclusive: упрощает directory/invalidation (LLC знает о копиях), но теряет ёмкость (дублирование).
- Non‑inclusive/exclusive: больше суммарной ёмкости, но сложнее поддерживать coherence. Для многиядерных систем часто выбирают non‑inclusive + directory.
- Для масштабируемости coherence выбирать directory‑based, с оптимизациями sharer storage (limited lists, hashed directories).
- Для смешанных рабочих нагрузок применять адаптивные политики (DRRIP/DRRIP+partitioning + bypass).
- Включить аппаратные счётчики invalidations/evictions, чтобы иметь фидбек и динамически корректировать политику.
6) Краткая сводка рекомендаций
- L1: приватный, write‑back, pseudo‑LRU, агрессивная локальность.
- L2: SRRIP/DRRIP, bimodal insertion, write‑allocate.
- L3 (shared): DRRIP + per‑core utility partitioning, bypass для стримов, directory‑based coherence для >8>8>8 ядер.
- Coherence: MESI/MOESI + directory (или snoop+MESIF для малого числа ядер), snoop‑filtering, forwarding, owner states.
- False sharing: аппаратное субблокирование/детектирование + программные практики (padding, репликация, миграция).
Если нужно, могу дать конкретную стенограмму регистров/бит для directory entry, схему subblock‑метки или пример порогов детектора false‑sharing.
20 Ноя в 09:37
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир