Связано: что такое буфер хранилища?
Буфер хранилища в целом состоит из нескольких записей .
Каждое ядро имеетсвой собственный буфер хранения 1 , чтобы отделить выполнение и удалить из фиксации в кэш L1d.Даже обычный процессор получает выгоду от буфера хранилища, чтобы избежать зависания в хранилищах с отсутствием кэша, потому что в отличие от нагрузок, они просто должны стать видимыми в конечном итоге .(Ни один из практических процессоров не использует модель памяти с последовательной согласованностью, поэтому, по крайней мере, разрешено переупорядочение StoreLoad, даже в x86 и SPARC-TSO).
Для спекулятивных / неупорядоченных процессоров это также делает возможнымоткатить магазин после обнаружения исключения или другого неправильного предположения в более старой инструкции, при этом спекулятивные магазины никогда не будут видны глобально.Это очевидно важно для правильности!(Вы не можете откатить другие ядра, поэтому вы не можете позволить им видеть данные вашего магазина, пока они не станут спекулятивными.)
Когда оба логических ядра активны (гиперпоточность),Intel разделяет буфер хранилища на две части;каждое логическое ядро получает половину.Загрузка из одного логического ядра отслеживает только свою половину буфера хранилища 2 . Что будет использоваться для обмена данными между потоками, выполняемыми на одном Ядре с HT?
Буфер хранения фиксирует данные из удаленных сохраняющих инструкции в L1d так быстро, как этоможет, в программном порядке (с учетом строго упорядоченной модели памяти x86 3 ).Требование к магазинам зафиксировать как , с которыми они выходят на пенсию, излишне задержит вывод на пенсию для магазинов с отсутствием кэша.Запасные хранилища, все еще находящиеся в буфере хранилища, определенно произойдут, и их нельзя будет откатить, поэтому они действительно могут снизить задержку прерывания.(Прерывания технически не требуются для сериализации, но любые хранилища, выполняемые обработчиком IRQ, не могут быть видны до тех пор, пока не будут удалены существующие ожидающие хранилища. И iret
сериализуется, поэтому даже в лучшем случае буфер хранилища истощается довозвращение.)
Это распространенное (?) заблуждение, что его необходимо явно сбросить, чтобы данные стали видимыми для других потоков.Барьеры памяти не вызывают сброса буфера хранилища, полные барьеры заставляют текущее ядро ждать , пока буфер хранилища не опустошится , прежде чем разрешить любую последующую загрузкуслучиться (т.е. прочитать L1d).Операции Atomic RMW должны ждать, пока буфер хранилища опустошится, прежде чем они смогут заблокировать строку кэша и выполнить как загрузку, так и сохранение в этой строке, не позволяя ему выйти из состояния MESI Modified, что не позволит любому другому агенту в системе наблюдать его во времяатомарная операция.
Чтобы реализовать строго упорядоченную модель памяти x86, в то же время микроархитектурно допуская ранние / неупорядоченные загрузки (и более позднюю проверку того, что данные все еще действительны, когда архитектурно разрешена загрузка), загрузитеbuffer + store буферные записи вместе образуют буфер порядка памяти (MOB) .(Если строка кэша не все еще присутствует, когда разрешена загрузка, это неправильное предположение порядка памяти.) Предположительно, эта структура может содержать инструкции mfence
и lock
ed.барьер, который блокирует переупорядочение StoreLoad, не блокируя неправильное выполнение.(Хотя mfence
на Skylake блокирует блокировку OoO exec независимых инструкций ALU , как подробности реализации.)
movnt
обход кэша хранилищ (например, movntps
) также проходят через буфер хранилища, поэтому они могут рассматриваться как спекулятивные, как и все остальное в исполняющем CPU OoO.Но они фиксируются непосредственно в LFB (Line Fill Buffer), он же буфер объединения записи, а не в кэш L1d.
Сохранение инструкций для процессоров Intel, декодируемых для хранения адресов хранения и хранения данных. (микросинтеграция в одну операцию объединения с доменом).Хранение-адрес uop просто записывает адрес (и, вероятно, ширину хранилища) в буфер хранилища, поэтому при последующих загрузках можно настроить пересылку store-> load или обнаружить, что они не перекрываются.Хранение данных UOP записывает данные.
Адрес хранилища и данные хранилища могут выполняться в любом порядке, в зависимости от того, что будет готово сначала: этап выделения / переименования, который записывает мопы из внешнего интерфейса в ROB иRS на заднем конце также выделяет буфер загрузки или сохранения для загрузки или сохранения мопов во время выдачи .Или глохнет, пока один не доступен.Поскольку распределение и фиксация происходят по порядку, это, вероятно, означает, что более старый / младший легко отслеживать, поскольку это может быть просто циклический буфер, который не должен беспокоиться о старых долгоживущих записях, которые все еще используются после переноса.(Если только обходные / слабо упорядоченные хранилища NT не могут это сделать? Они могут фиксировать LFB (Line Fill Buffer) не по порядку. В отличие от обычных хранилищ, они передают непосредственно в LFB для передачи вне ядра, а не в L1d.)
но каков размер записи?
Размеры буфера хранилища измеряются в записях, а не в битах.
Narrowхранилища не «используют меньше места» в буфере хранилища, они по-прежнему используют ровно 1 запись.
Буфер хранилища Skylake содержит 56 записей ( wikichip ), по сравнению с 42 вHaswell / Broadwell , и 36 в SnB / IvB ( В обзоре HSW Дэвида Кантера на RealWorldTech есть диаграммы) .Вы можете найти числа для более ранних версий x86 в рецензиях Кантера на RWT, диаграммах Викичипа или других источниках.
SKL / BDW / HSW также имеет 72 записи в буфере загрузки, SnB / IvB - 64. Этоколичество инструкций загрузки в полете, которые либо не выполнялись, либо ожидают поступления данных из внешних кэшей.
Размер в битах каждой записи является реализациейдетали, которые не влияют на то, как вы оптимизируете программное обеспечение.Точно так же мы не знаем размер в битах UOP (во внешнем интерфейсе, в ROB, в RS), или детали реализации TLB, или многие другие вещи, но мы знаем, сколько ROB и RSЕсть записи, и сколько записей TLB разных типов в разных uarches.
Intel не публикует принципиальные схемы для своих конструкций ЦП, и (AFAIK) эти размеры обычно не известны, поэтому мы можемдаже не удовлетворяет наше любопытство по поводу деталей дизайна / компромиссов.
Запись слияния в буфере хранилища:
Узкие хранилища вплотную к одной и той же строке кэша могут (возможно?) быть объединенным или объединенным в буфере хранилища перед их фиксацией, поэтому для фиксации нескольких хранилищ может потребоваться всего один цикл на порте записи кэша L1d.
Мы точно знаем, что некоторые процессоры, отличные от x86, делают этои у нас есть некоторые доказательства / основания полагать, что процессоры Intel действительно делают это.Но это ограничено.См. Обсуждение, начинающееся с этого комментария: Используются ли буферы объединения записи для обычной записи в области памяти WB на Intel?
А также Неожиданно низкая и странно бимодальная производительность для цикла хранения приIntel Skylake может быть уместным.
Мы точно знаем, что некоторые слабо упорядоченные ISA, такие как Alpha 21264, хранили слияние в своем буфере хранения, потому что руководство документирует это вместе сего ограничения на то, что он может фиксировать и / или читать в / из L1d за цикл.Также PowerPC RS64-II и RS64-III, с меньшей детализацией, в документах, связанных с комментарием здесь: Существуют ли какие-либо современные процессоры, в которых кэшированное хранилище байтов на самом деле медленнее, чем хранилище слов?
Люди опубликовали статьи о том, как сделать (более агрессивным?) Объединение магазинов в моделях памяти TSO (например, x86), например, Неспекулятивное объединение магазинов в общем порядке магазинов
Объединение может позволить освободить запись буфера хранилища до того, как ее данные передадут в L1d (предположительно, только после удаления), если его данные будут скопированы в хранилище в той же строке.Это может произойти только в том случае, если никакие хранилища с другими строками не разделяют их, иначе это приведет к тому, что хранилища будут зафиксированы (станут глобально видимыми) не по порядку программы, что нарушит модель памяти.Но мы думаем, что это может произойти для любых 2 хранилищ с одной и той же строкой, даже с первым и последним байтом.
(Это может означать, что каждая запись SB имеет 64 байта для данных, если только объединение не отличается от обычных записей SBНо Skylake-AVX512 почти наверняка имеет 64-байтовые записи SB, потому что один магазин может быть таким широким. Для чего бы то ни было, сообщалось, что SKL и SKX в основном имеют одно и то же ядро, просто не хватает 2-го 512-битного блока FMAи, вероятно, верхний 256-битный физический регистровый файл. Таким образом, записи буфера хранилища в SKL почти наверняка имеют место для 64 байтов данных, даже если более ранние процессоры этого не делают. Но на самом деле мы думаем, что многие более ранние процессоры do имеютпространство для объединения любых соседних хранилищ в одну строку.)
Терминология: Я использовал «объединение», чтобы говорить о слиянии в буфере хранилища, а не «записи»объединение, чтобы говорить о магазинах NT, которые объединяются в LFB прежде, чем (мы надеемся) сделать полную запись без RFO.Или сохраняет в области памяти WC, которые делают то же самое.
Это различие / соглашение - просто то, что я придумал.Согласно обсуждению в комментариях, это может не соответствовать стандартной терминологии компьютерной архитектуры.
Руководства Intel (особенно руководство по оптимизации) написаны разными авторами на протяжении многих лет, а также не соответствуют их терминологии.. Возьмите большую часть руководства по оптимизации с частичкой соли, особенно если речь идет о Pentium4.Новые разделы о Sandybridge и Haswell являются надежными, но у более старых частей могут быть устаревшие рекомендации, которые относятся только к P4 (например, inc против add 1), или объяснения некоторых правил оптимизации микроархитектуры могут вводить в заблуждение / ошибаться.Особенно раздел 3.6.10 Write Combining.Первый пул об использовании LFB для объединения хранилищ в ожидании поступления строк для хранилищ с отсутствием кэша в WB-память просто не выглядит правдоподобным из-за правил упорядочения памяти.Смотрите обсуждение между мной и BeeOnRope, связанное выше, и в комментариях здесь.
Сноска 1:
Объединяющий запись кэш для буфера обратной записи (илисквозной записи) из внутренних кэшей будет иметь другое имя.Например, семейство Bulldozer использует 16 тыс. кешей L1d сквозной записи с небольшим буфером обратной записи 4 тыс.(См. Почему кэш-память L1 и L2 расходует одни и те же данные? для получения подробной информации и ссылок на еще более подробную информацию. См. Оценка размера кэша в вашей системе? для перезаписи имикробенчмарк массива, который замедляется за пределы 4k на процессоре семейства Bulldozer.)
Сноска 2 : некоторые процессоры POWER позволяют другим потокам SMT отслеживать удаленные хранилища в буфере хранилища: это может вызвать разные потокине согласиться с глобальным порядком магазинов из других тем. Будут ли две атомарные записи в разные места в разных потоках всегда замечаться в одном и том же порядке другими потоками?
Сноска 3 : ЦП, отличные от x86, со слабой моделью памятиможет фиксировать удаленные хранилища в любом порядке, позволяя более агрессивно объединять несколько хранилищ в одну строку и делать так, чтобы хранилище с ошибками кэша не блокировало фиксацию других хранилищ.