Устранение отслеживания кеша для локальной памяти потока

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

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

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

Будет ли отслеживание еще происходить, если вы объявите соответствующие переменные thread_local? К сожалению, в соответствии с принятым ответом на другие потоки могут изменять локальный поток память?

Предоставляет ли какая-либо существующая в настоящее время платформа (комбинация ЦП и операционной системы) какой-либо способ отключить отслеживание локальных данных потока? Не обязательно быть портативным; мне все еще интересно, если для этого требуется выполнить вызовы API для конкретной ОС или даже перейти в сборку.


person rwallace    schedule 24.03.2021    source источник
comment
Современные многоядерные процессоры синхронизируют кэш между ядрами с помощью отслеживания - не совсем, это не масштабируется по мощности и совокупной пропускной способности кэша L3. На практике современные процессоры используют согласованность на основе каталогов, например Теги в инклюзивном кэше L3 Intel дополнены битами, указывающими на то, какое ядро ​​может иметь измененную копию строки.   -  person Peter Cordes    schedule 26.03.2021
comment
К сожалению, это один из многих способов оплаты поддержки прозрачной разделяемой памяти. Для полного исключения трафика отслеживания (или соответствующего поиска в каталогах) для частной памяти потока может потребоваться, чтобы ОС закрепила поток в конкретном контексте кэша и чтобы ОС была спроектирована так, чтобы она либо никогда не получала указатели на частную память потока, либо что любой системный вызов, использующий такой указатель, должен выполняться на том же ядре, которое выполнило вызов. Иерархические (страничные) каталоги могут уменьшить большую часть трафика отслеживания, возможно, в сочетании с расширенной поддержкой TLB.   -  person John D McCalpin    schedule 29.03.2021


Ответы (2)


Большинство современных процессоров используют протокол согласованности каталогов для поддержания согласованности между всеми ядрами в одном узле NUMA и другой протокол согласованности каталогов для поддержания согласованности между всеми узлами NUMA и концентраторами ввода-вывода, которые находятся в одном домене согласованности, где каждый узел NUMA может быть активный сокет, часть активного сокета или контроллер узла. Краткое введение в согласованность в реальных процессорах можно найти по адресу: Когерентность кэша (протокол MESI) между разными уровнями кеширования, а именно L1, L2 и L3.

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

  • Линия автоматически удаляется из ядра или узла NUMA без уведомления контроллера каталога.
  • Состояние каталога может быть защищено кодом обнаружения ошибок. Если состояние считается поврежденным, требуется широковещательная передача.
  • В зависимости от микроархитектуры каталог в памяти может не иметь возможности отслеживания строк кэша для каждого узла NUMA, а скорее на уровне детализации любого другого узла NUMA.

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

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

person Hadi Brais    schedule 26.03.2021
comment
Фильтры отслеживания также могут снизить когерентный трафик. Стоимость задержки отслеживания также может перекрываться с задержкой чтения памяти. Стоимость полосы пропускания также является фактором. Полный каталог может быть реализован путем репликации тегов, что дорого, или хранения данных каталога для каждого фрагмента памяти (что требует объема памяти, пропорционального объему памяти - один метод, используемый для Alpha 21364, использовал ECC для каждого блока кеша и дополнительные биты для хранить ограниченную справочную информацию). Избегать ненужных действий по согласованию все еще желательно. - person Paul A. Clayton; 26.03.2021

Существует базовый протокол, основанный на признании недействительности, MESI, который в некоторой степени является основополагающим. Есть и другие его расширения, но он служит для минимизации количества транзакций шины при чтении или записи. MESI кодирует состояния, в которых может находиться строка кэша: Modified, Exclusive, Shared, Invalid. Базовая схема MESI включает два представления. Штрих (-) означает, что возможно изменение внутреннего состояния, но не требуется никаких внешних операций. От процессора до его кеша:

           M   E  S   I
Read       -   -  -   2
Write      -   -  1   3

куда:

  1. Выдать аннулирование шины, изменить состояние на M.
  2. Выполните чтение шины, измените состояние на S.
  3. Выполнить чтение шины + аннулирование шины, изменить состояние на M.

Кроме того, эти состояния прослушивают внешнюю шину, поэтому от шины до кеша:

           M   E  S  I
Read       4   -  -  -
Write      5   -  -  -
  1. Сбросить из кеша, перейти на S.
  2. Сбросить из кеша, сменить на I.

Таким образом, автобусные агенты сотрудничают, чтобы генерировать минимально необходимые транзакции.

Многие CPU, особенно встроенные контроллеры, имеют cpu-private-memory, что может быть отличным кандидатом на локальное хранилище потоков; однако для переноса потока из одного ядра в другое потребуется отследить все переменные локального хранилища его потока и скопировать их (каким-то образом) в частную память нового ядра.

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

person mevets    schedule 24.03.2021
comment
Это модель с общей шиной, которую обычно описывают в MESI, но современные настоящие процессоры так не работают. Межсоединение - это не общая шина, за доступ к которой соревнуются все ядра. например Семейство Intel Sandybridge использует кольцевую шину (realworldtech.com/sandy-bridge/8), или в серверных версиях, начиная с Skylake-X, и далее - сетку. Таким образом, все ядра могут одновременно передавать сообщения в срезы кэша L3. Они используют согласованность на основе каталогов. При промахе L3 возникают дополнительные накладные расходы на когерентность, особенно в системе с несколькими сокетами, чтобы убедиться, что на другом сокете он не изменен. - person Peter Cordes; 26.03.2021