clwb + sfence, можем ли мы удалить sfence, если записи выровнены по строке кэша?

Согласно информации о заказе clwb (ссылка),

Инструкция CLWB заказывается только операциями по ограждению магазина. Например, программное обеспечение может использовать инструкции с префиксом SFENCE, MFENCE, XCHG или LOCK, чтобы гарантировать, что предыдущие хранилища включены в обратную запись. Инструкцию CLWB не нужно заказывать другой инструкцией CLWB или CLFLUSHOPT. CLWB неявно упорядочивается с более старыми хранилищами, выполняемыми логическим процессором по тому же адресу.

Если набор операций на Intel X86-64 выглядит следующим образом, могу ли я удалить sfence и по-прежнему гарантировать правильность, если записи (A) и запись (B) выровнены по строке кэша .

Я спрашиваю об этом, поскольку на Intel запись (A) и запись (B) упорядочены (TSO), а запись (A) - ›clwb (A) и write (B) - ›clwb (B) упорядочены в соответствии с приведенным выше описанием clwb

write(A)
clwb(A)
sfence()
write(B)
clwb(B)

Я делаю следующие предположения

  1. компилятор не меняет порядок этих операций
  2. Инструкция clwb () записывает грязную строку обратно в постоянный домен, поэтому пара write (A) - ›clwb (A) гарантирует, что измененное значение A находится в постоянном домене.

Скажите, может ли удаление sfence нарушить правильность? если да, то по каким сценариям Спасибо


person Arun Kp    schedule 18.05.2021    source источник
comment
Для обычных хранилищ в памяти WB, которые находятся в одной строке кэша: да, порядок сохранения соответствует порядку глобальной наблюдаемости x86-TSO. Является ли clflush или clflushopt атомарным при сбое системы?. В противном случае это не гарантируется. Что вы имеете в виду под выровненной строкой кэша? Два отдельных 512-битных хранилища ZMM в двух отдельных строках кеша?   -  person Peter Cordes    schedule 18.05.2021
comment
Да, я видел сообщение, о котором вы говорили, я имел в виду, что хранилище выровнено по строке кеша, поскольку clwb () работает с детализацией строки кеша. Мой вопрос в том, обеспечивает ли clwb () обратную запись грязной строки кеша до буфера записи контроллера памяти (я предполагаю, что очередь записи контроллера памяти является частью постоянного домена).   -  person Arun Kp    schedule 18.05.2021
comment
Значит, вы имеете в виду, что A полностью содержится в одной строке кэша, а B - в отдельной? Если так, скажите так, не выровнено по строке кэша. Я почти уверен, что без SFENCE после сбоя можно было бы увидеть эффект B, но не A. clwb не упорядочен, поэтому последний может сначала сделать свое хранилище постоянным. Это то, на что указывает руководство clwb, что в clwb отсутствует порядок написания. нормальные магазины.   -  person Peter Cordes    schedule 18.05.2021
comment
Да, я имел в виду, что A и B содержатся в отдельных строках кеша, извините за путаницу. Вы точно указали на мои сомнения, если эффект B виден после аварии, это означает, что произошло clwb (B). Итак, согласно TSO, запись (B) произошла, означает, что запись (A) произошла (может быть, она находится в буфере хранилища). Согласно руководству, CLWB неявно упорядочивается со старыми хранилищами, выполняемыми логическим процессором по тому же адресу., То есть clwb (A) происходит только после записи (A), поэтому программный порядок не гарантирует, что clwb (A) произошел с учетом записи (B ) произошло и видно после аварии? спасибо @Peter   -  person Arun Kp    schedule 18.05.2021
comment
Я рассматриваю это как транзитивный порядок, означающий, что запись (A) - ›запись (B) упорядочена, а запись (B) -› clwb (B) упорядочена, так как clwb (B) может обойти запись (B) [таким образом нарушает ограничение порядка, установленное в руководстве], и происходит до clwb (A), таким образом вызывая эффект clwb (B), видимый после сбоя, а не clwb (A)?   -  person Arun Kp    schedule 18.05.2021
comment
Re: буфер хранилища: нет, порядок x86-TSO касается фиксации из буфера хранилища в L1d, указатель глобальной наблюдаемости. Это, конечно, полностью отделено от возможной обратной записи (через вытеснение или clwb) в DRAM.   -  person Peter Cordes    schedule 18.05.2021
comment
Спасибо за разъяснение, каково точное значение этой строки, тогда CLWB неявно упорядочивается с более старыми хранилищами, выполняемыми логическим процессором по тому же адресу.   -  person Arun Kp    schedule 18.05.2021
comment
Я писал ответ, так как ваши комментарии, наконец, дали достаточно подсказок о том, чего вам не хватало в документации.   -  person Peter Cordes    schedule 18.05.2021


Ответы (1)


Для обычных хранилищ в памяти WB, которые находятся в пределах той же строки кэша: да, порядок сохранения соответствует глобальному порядку наблюдаемости x86-TSO, см. Является ли clflush или clflushopt атомарным при сбое системы?. В противном случае это не гарантируется.

Кажется, вы имеете в виду, что A полностью содержится в одной строке кеша, а B - в отдельной.

Без SFENCE после сбоя можно было бы увидеть эффект B, но не A. clwb не упорядочен, поэтому последний может сначала сделать свое хранилище постоянным. Это то, на что указывает руководство clwb, что в clwb отсутствует порядок написания. нормальные магазины.

Итак, согласно TSO, запись (B) произошла, означает, что запись (A) произошла (может быть, она находится в буфере хранилища).

Нет, упорядочение x86-TSO связано с порядком фиксации из буфера хранилища в L1d, указатель глобальной наблюдаемости. Это, конечно, полностью отделено от возможной обратной записи (через вытеснение или clwb) в DRAM. Операторы хранилища могут выполнять (записывать свой адрес + данные в буфер хранилища) в любом порядке, но не могут выполнять фиксацию до тех пор, пока не будут удалены (т. Е. Когда они не спекулятивно). Кроме того, эта фиксация ограничена программным порядком, то есть записи буфера хранилища порядка были выделены во время выдачи / переименования / выделения.

означает, что запись (A) - ›запись (B) упорядочена, а запись (B) -› clwb (B) упорядочена, так как clwb (B) может обойти запись (B) [таким образом нарушая ограничение порядка в руководстве] и произойдет перед clwb (A), что вызывает эффект clwb (B), видимый после сбоя, а не clwb (A)?

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

Порядок операций, при которых после сбоя появляется B, но не отображается A, следующий:

  • A и B выполняются в некотором порядке
  • A и B фиксируются в кэше L1d, когда это ядро ​​получает эксклюзивное право собственности MESI на их соответствующие строки, становясь глобально видимыми для других ядер.
  • Инструкции clwb выполняются в какой-то момент, запрашивая, чтобы строки кэша были записаны обратно в DRAM в какой-то момент после фиксации хранилища.
  • обратная запись строки A начинается в некоторый момент после ее фиксации в L1d, и то же самое для строки B. Они могут начинаться в любом порядке, поскольку порядок clwb не гарантируется по отношению к. другие операции clwb с другими строками, хотя на практике они, скорее всего, запускаются в программе.
  • clwb-B становится стойким
  • машина теряет мощность до того, как clwb-A в полете переходит в область постоянства. Вы не запрашивали заказ операций clwb по отношению к. друг друга, так что это разрешено.

Что касается переупорядочивания asm-инструкций, допускается следующий переупорядочение:

 store A
 store B
 clwb  B
 clwb  A     ; not ordered wrt. store B or clwb B

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

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

SFENCE может предотвратить это.

person Peter Cordes    schedule 18.05.2021
comment
Спасибо за разъяснения. Один небольшой последний вопрос: когда мы говорим, что инструкции фиксируются в PO (программном порядке), означает ли PO любой действительный порядок, который компилятор может сгенерировать на основе модели согласованности памяти (например, пример asm, который вы упомянули), или это порядок, в котором программист написал программу, т.е. без переупорядочивания - person Arun Kp; 18.05.2021
comment
@ArunKp: Это означает инструкции asm, ни больше ни меньше. Если вы не пишете asm вручную, то да, порядок инструкций asm зависит от модели памяти языка. Таким образом, вам понадобится барьер компилятора, такой как GNU C asm("":::"memory") или C ++ atomic_signal_fence(mo_release), чтобы упорядочить хранилища wrt. друг друга в ассемблере. Конечно, _mm_sfence() является барьером компилятора, а также генерирует барьер asm. См. Когда мне следует использовать _mm_sfence _mm_lfence и _mm_mfence - person Peter Cordes; 18.05.2021
comment
@ArunKp: также см. preshing.com/20120625/memory-ordering-at -время компиляции - person Peter Cordes; 18.05.2021