Что означает «пересылка из буфера» в руководстве разработчика Intel

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

  

Чтения могут быть переупорядочены со старыми записями в разные места, но   не со старыми записями в том же месте.

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

  

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

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

12 голосов | спросил jacobsa 12 J0000006Europe/Moscow 2014, 08:46:57

3 ответа


0

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

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

Несмотря на то, что некоторые другие ответы здесь заявляют, нет (по крайней мере, насколько гарантируют упорядочение) НИКАКОЙ пересылки /отслеживания буфера хранилища между процессорами /ядрами, как в 8.2.3.5 «Внутрипроцессорная пересылка разрешена» Пример в руководстве показывает.

ответил Radu 8 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowMon, 08 Sep 2014 17:10:30 +0400 2014, 17:10:30
0

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

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

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

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

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

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

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

ответил Hans Passant 12 J0000006Europe/Moscow 2014, 12:39:57
0

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 разрешено.

     

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

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

ответил Michael Burr 12 J0000006Europe/Moscow 2014, 09:30:08

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132