Почему протокол MESI не может гарантировать атомарность CMPXCHG на x86 без префикса LOCK? - PullRequest
5 голосов
/ 05 мая 2019

Я понимаю, что протокол MESI успешно гарантирует одинаковое представление памяти (кешей) для разных ядер. Мой вопрос связан с тем, что во время записи MESI гарантирует, что кеш принадлежит исключительно процессору, а затем атомарный CMPXCHG просто сравнивает и обменивается значениями атомарно. Так почему же нам нужно использовать инструкцию LOCK и, таким образом, заблокировать строку кэша, когда у нас уже есть эта гарантия от протокола MESI?

1 Ответ

5 голосов
/ 06 мая 2019

atomic CMPXCHG просто сравнивает и обменивается значениями атомарно

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

Если так работает обычный CMPXCHG, ваши рассуждения будут правильными.Но обычный CMPXCHG не атомарный (для наблюдателей на других ядрах).


lock cmpxchg декодирует в несколько мопов, которые сохраняют строку кэша «заблокированной» от загрузки дохранить, превращая его в одну атомарную транзакцию, насколько могут видеть любые другие наблюдатели в системе.(т.е. задержка ответа на недействительные MESI или совместное использование запросов для этой строки до тех пор, пока хранилище не завершит работу).Это также делает его полным барьером памяти.


Без lock, CMPXCHG декодирует в несколько загружаемых мопов, проверяет на равенство, а затем либо сохраняет новое значение, либоне в соответствии с результатом сравнения. Что касается атомарности, то это то же самое, что и add [mem], edx, который использует ALU для сложения между загрузкой и хранением мопов.то есть это не атомарный, за исключением того же ядра относительно прерываний (потому что прерывания могут происходить только на границе инструкций).

Загрузка и сохранение каждого отдельно atomic, но они не являются единственной атомарной транзакцией RMW. Если другое ядро ​​делает недействительной нашу копию строки кэша и сохраняет новое значение между нашей загрузкой и нашим хранилищем, наш магазин перейдет в другое хранилище,И это другое хранилище появится в глобальном порядке операций в этой строке кэша между нашей загрузкой и хранилищем, нарушая определение «атомарный» = неделимый.

...