Что означает "пересылка хранилища-буфера" в руководстве разработчика Intel?

Руководство разработчика программного обеспечения для архитектуры Intel 64 и IA-32 после переупорядочения действий одним процессором (раздел 8.2.2, "Заказ памяти в P6 и более поздних семействах процессоров" ):

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

Затем ниже при обсуждении точек, где это расслаблено по сравнению с предыдущими процессоров, он говорит:

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

Насколько я могу судить, "пересылка хранилища-буфера" точно не определена в любом месте (и ни один из них не проходит). Что означает чтение для чтения записи в том же месте здесь, учитывая, что выше сказано, что чтение не может быть переупорядочено с записью в том же месте?

Ответ 1

Именование немного неудобно. "Пересылка" происходит внутри ядра/логического процессора, как показано ниже. Если вы сначала сделаете МАГАЗИН, он перейдет в буфер хранилища, чтобы асинхронно покраснет в память. Если вы выполняете последующую ЗАГРУЗКУ в том же месте на одном и том же процессоре до того, как значение будет сброшено в кэш/память, значение из буфера хранения будет "переадресовано", и вы получите значение, которое было просто сохранено. Чтение "передает" запись в том, что это происходит до фактической записи из буфера хранилища в память (что еще не произошло).

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

Несмотря на то, что некоторые из других ответов здесь приводятся, есть (по крайней мере, до тех пор, пока не гарантируются заказы). НЕТ буфера-буфера пересылки/отслеживания между процессорами/ядрами, поскольку 8.2.3.5 "Внутрипроцессорная пересылка разрешена" пример в руководствах.

Ответ 2

Я бы предположил, что зависание - это понятие "store-buffer". Отправной точкой является большое несоответствие между скоростью ядра процессора и скоростью памяти. Современное ядро ​​может легко выполнить десяток команд в наносекунду. Но RAM-чип может потребовать 150 наносекунд, чтобы доставить значение, хранящееся в памяти. Это огромное несоответствие, современные процессоры заполнены до краев трюками, чтобы обойти эту проблему.

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

Писать проще, процессор имеет для них буфер. Моделируйте их как очередь в программном обеспечении. Таким образом, механизм выполнения может быстро сбрасывать инструкцию хранилища в очередь и не будет увязнуть в ожидании физической записи. Это буфер-хранилище. Таким образом, физические записи в память происходят намного позже, чем логические хранилища в вашей программе.

Проблема начинается, когда ваша программа использует несколько потоков, и они обращаются к тем же ячейкам памяти. Эти потоки будут работать на разных ядрах. Многие проблемы с этим, упорядочение становится очень важным. Очевидно, что ранние чтения, выполненные префишером, заставляют его читать устаревшие значения. И поздние записи, выполненные буфером хранилища, еще хуже. Для его решения требуется синхронизация между потоками. Что очень дорого, процессор легко останавливается на десятки наносекунд, ожидая подсистемы памяти, чтобы догнать. Вместо потоков, ускоряющих вашу программу, они могут сделать это медленнее.

Процессор может помочь, пересылка хранилища-буфера является одним из таких трюков. Логическое чтение в одном потоке может передавать физическую запись, инициированную другим потоком, когда хранилище все еще находится в буфере и еще не выполнено. Без синхронизации в программе, которая всегда заставит поток читать устаревшее значение. То, что происходит с пересылкой буфера хранилища, - это просмотр ожидающих хранения в буфере и поиск последней записи, которая соответствует адресу чтения. Это "форвард" магазина во времени, что делает его похожим на то, что он был выполнен раньше, чем будет. Поток получает фактическое значение; тот, который, в конце концов, заканчивается в памяти. Чтение больше не пропускает запись.

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

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

Ответ 3

8.2.3.5 "Внутрипроцессорная пересылка разрешена" объясняет пример пересылки хранилища-буфера:

Изначально x = y = 0

    Processor 0             Processor 1
   ==============          =============
    mov [x], 1              mov [y], 1
    mov r1, [x]             mov r3, [y]
    mov r2, [y]             mov r4, [x]

Разрешены результаты r2 == 0 и r4 == 0.

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

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