Является ли память вне каждого ядра всегда концептуально плоской / однородной / синхронной в многопроцессорной системе? - PullRequest
5 голосов
/ 23 мая 2019

Многопроцессорные системы выполняют «реальные» операции с памятью (те, которые влияют на окончательное выполнение, а не только на умозрительное выполнение) не по порядку и асинхронно, так как ожидание глобальной синхронизации глобального состояния без необходимости останавливало бы все выполнения почти все время. С другой стороны, сразу за каждым отдельным ядром кажется, что система памяти, начиная с кеша L1, является чисто синхронной, последовательной, плоской с точки зрения разрешенного поведения (разрешенная семантика); очевидно, что время зависит от размера и поведения кэша.

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

Это всегда так на современных компьютерах (современных = тех, которые могут разумно поддерживать C ++ и Java)?

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

Все ли процессоры блокируют и синхронизируют все обращения к памяти на ограждении или операции синхронизации?

Может ли память использоваться как почти бесконечный регистровый ресурс, не подлежащий ограждению?

Ответы [ 2 ]

2 голосов
/ 23 мая 2019

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

Я не уверен, что вызначит здесь.Если поток обращается к частным данным (то есть не разделяется с любым другим потоком), то почти нет необходимости в инструкциях по ограничению памяти 1 .Заборы используются для управления порядком, в котором доступы к памяти из одного ядра видны другим ядрам.

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

Я думаю (если я вас правильно понимаю) то, что вы описываете, называется памятью блокнота (SPM), которая представляет собой аппаратную структуру памяти, которая сопоставлена ​​с архитектурнойфизическое адресное пространство или имеет свое собственное физическое адресное пространство.Программное обеспечение может напрямую обращаться к любому местоположению в SPM, аналогично основной памяти.Однако, в отличие от основной памяти, SPM имеет более высокую пропускную способность и / или меньшую задержку, чем основная память, но, как правило, его размер намного меньше.

SPM намного проще, чем кеш, поскольку ему не нужны теги, MSHR, политика замены или аппаратные средства предварительной выборки.Кроме того, согласованность SPM работает как основная память, т. Е. Она вступает в игру только при наличии нескольких процессоров.

SPM используется во многих коммерческих аппаратных ускорителях, таких как графические процессоры, DSP и многоядерные процессоры.Один из примеров, с которым я знаком, - это многоядерный процессор MCDRAM от Knights Landing (KNL), который можно настроить для работы в качестве ближней памяти (т. Е. SPM), кэш-памяти последнего уровня для основной памяти или гибридной.Часть MCDRAM, которая настроена для работы в качестве SPM, отображается в то же физическое адресное пространство, что и DRAM, и кэш L2 (который является частным для каждой плитки) становится кэшем последнего уровня для этой части MCDRAM.Если есть часть MCDRAM, которая настроена как кэш для DRAM, то это будет только кэш последнего уровня DRAM, а не часть SPM.MCDRAM имеет гораздо более высокую пропускную способность, чем DRAM, но задержка примерно одинакова.

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

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

SPM не очень подходит для настольных или серверных систем общего назначения, где они могут быть одновременно запущены несколькими приложениями.Такие системы не предъявляют требований в реальном времени, и в настоящее время средняя потребность в полосе пропускания не оправдывает стоимость включения чего-то вроде MCDRAM.Кроме того, использование SPM на уровне L1 или L2 налагает ограничения на размер SPM и кэшей и затрудняет использование такой иерархии памяти для ОС и приложений.

Память Intel Optance DC может быть сопоставлена ​​сфизическое адресное пространство, но оно находится на том же уровне, что и основная память, поэтому оно не считается SPM.


Сноски:

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

2 голосов
/ 23 мая 2019

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

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


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

Огромные системы с несколькими отдельными доменами когерентности, требующие явного сброса, больше похожи на тесно связанный кластер для эффективной передачи сообщений, а не на SMP.система.(Обычные системы с несколькими сокетами NUMA согласованы с кэшем: Безопасен ли mov + mfence для NUMA? подробно описывается для x86.)


Хотяядро имеет строку кэша в состоянии MESI Modified или Exclusive, оно может изменить ее без уведомления других ядер об изменениях.Состояния M и E в одном кеше означают, что никакие другие кеши в системе не имеют действительной копии строки.Но нагрузки и хранилища все еще должны учитывать модель памяти, например, ядро ​​x86 все еще должно фиксировать хранилища в кэш L1d в программном порядке.


L1d и L2 являются частью aсовременное ядро ​​процессора, но вы правы, что L1d фактически не видоизменен.Это может быть чтение спекулятивно.

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

Что такое буфер хранилища? и Размер буферов хранилища на оборудовании Intel?Что именно представляет собой буфер хранилища?

Буфер хранилища необходим для отделения спекулятивного исполнения вне порядка (запись данных + адрес в буфер хранилища) из порядказафиксировать глобально видимый кэш L1d.

Это очень важно даже для ядра в порядке, в противном случае хранилища с отсутствием кэша остановят выполнение.И вообще, вы хотите, чтобы буфер хранилища объединял последовательные узкие хранилища в одну более широкую запись в кеш, особенно для слабо упорядоченных uarches, которые могут делать это агрессивно;многие неархитектурные микроархитектуры имеют полностью эффективную фиксацию в кэше только для выровненных 4-байтовых или более широких фрагментов.

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


Существуют некоторые ограничения для этой модели:

  • ограниченный размер буфера хранилища означает, что у нас мало личного пространства для хранения / перезагрузки
  • строго упорядоченныйМодель памяти не позволяет частным хранилищам выполнять фиксацию в L1d не по порядку, поэтому сохранение общей переменной, которая должна ожидать строки из другого ядра, может привести к заполнению буфера хранилища частными хранилищами.
  • барьер памятиинструкции типа x86 mfence или lock add, или ARM dsb ish должны истощать буфер хранилища, поэтому данные сохраняются (и перезагружаются) из потока-частная память, которая на практике не используется совместно, все еще должна ждать, пока магазины, о которых вы заботитесь, станут глобально видимыми.
  • и наоборот, ожидая, что общий магазин, о котором вы заботитесь, станет видимым (с барьером или релиз-магазином).также ожидать операций с частной памятью, даже если они независимы.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...