атомарная операция стоится

Какова стоимость атомарной операции (какой-либо из сравнивать-и-подкачивать, или атомарные добавляют/постепенно уменьшают)? Сколько циклов это использует? Действительно ли это приостановит другие процессоры на SMP или NUMA, или будет это доступы памяти блока? Это сбросит буфер восстановления последовательности в неисправном ЦП?

Чем эффекты будут в кэше?

Я интересуюсь современными, популярными центральными процессорами: x86, x86_64, PowerPC, SPARC, Itanium.

79
задан Peter Cordes 17 October 2016 в 20:00
поделиться

2 ответа

Я искал фактические данные за последние дни и ничего не нашел. Однако я провел небольшое исследование, в котором сравнивается стоимость атомарные операции с затратами на промахи кеша.

Стоимость префикса x86 LOCK или CAS перед PentiumPro (как описано в документе) - это доступ к памяти (например, промах в кэше), + остановка операций с памятью другими процессорами, + любые конфликты с другими процессорами, пытающимися ЗАПИРАТЬ автобус. Однако, начиная с PentiumPro, для памяти с обратной записью (т.е. кэшируемой) (всей памяти, с которой работает приложение, если вы не взаимодействуете напрямую с оборудованием), вместо того, чтобы блокировать все операции с памятью, блокируется только соответствующая строка кэша (на основе ссылки, размещенной выше).

На самом деле, случай CAS может быть более сложным, как объяснено на этой странице , без таймингов, но с подробным описанием, сделанным надежным инженером.

Прежде чем вдаваться в подробности, я скажу, что ЗАБЛОКИРОВАННАЯ операция стоит один промах в кэше + возможное соперничество с другим процессором в той же строке кэша, в то время как CAS + предыдущая загрузка (которая почти всегда требуется, за исключением мьютексов, где вы всегда CAS 0 и 1) может стоить два промаха кеша.

Он объясняет, что загрузка + CAS в одном месте на самом деле может стоить два промаха кеша, как, например, Load-Linked / Store-Conditional (последнее см. Там). Его объяснение основано на знании протокола согласованности кэша MESI . Он использует 4 состояния для строки кэша: M (odified), E (xclusive), S (hared), I (nvalid) (и поэтому он называется MESI), где это необходимо, объясняется ниже. Сценарий, как объясняется, следующий:

  • ЗАГРУЗКА вызывает промах в кэше - соответствующая строка кэша загружается из памяти в общем состоянии (т. Е. Другим процессорам по-прежнему разрешено сохранять эту строку кэша в памяти; в этом состоянии никакие изменения не допускаются. ). Если место находится в памяти, этот промах в кэше пропускается. Возможная цена: 1 промах в кеш-памяти. (пропускается, если строка кэша находится в состоянии Shared, Exclusive или Modified, т. Е. Данные находятся в кэше L1 этого CPU).
  • программа вычисляет новые значения для сохранения,
  • и выполняет атомарную инструкцию CAS.
    • Она должна избегать одновременного изменения, поэтому она должна удалить копии cacheline из кэша других процессоров, чтобы переместить строку кэша в эксклюзивное состояние. Возможная цена: 1 промах кеша. В этом нет необходимости, если он уже находится в исключительном владении, то есть в эксклюзивном или измененном состоянии. В обоих состояниях никакие другие ЦП не удерживают строку кэша, но в состоянии Exclusive она не была изменена (пока).
    • После этого взаимодействия переменная изменяется в локальном кэше нашего ЦП, после чего она становится глобально видимой для всех других ЦП (потому что их кеши согласованы с нашим).В конечном итоге он будет записан в основную память по обычным алгоритмам.
    • Другие процессоры, пытающиеся прочитать или изменить эту переменную, сначала должны будут получить эту строку кэша в общем или эксклюзивном режиме, и для этого они обратятся к этому процессору и получат обновленную версию строки кэша. ЗАБЛОКИРОВАННАЯ операция. вместо этого может стоить только промаха кеша (потому что строка кэша будет запрашиваться непосредственно в исключительном состоянии).

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

54
ответ дан 24 November 2019 в 10:19
поделиться

В SMP на базе шины атомарный префикс LOCK действительно утверждает (включает) сигнал шинного провода LOCK#. Он запрещает другим процессорам/устройствам на шине использовать его.

Ppro & P2 book http://books.google.com/books?id=3gDmyIYvFH4C&pg=PA245&dq=lock+instruction+pentium&lr=&ei=_E61S5ehLI78zQSzrqwI&cd=1#v=onepage&q=lock%20instruction%20pentium&f=false pages 244-246

Locked instructions are serializing, synchronizing operations .... /about Out-of-order/ заблокированная RMW/read-modify-write = atomic itself/ инструкция гарантирует, что процессор выполнит все инструкции перед заблокированной инструкцией до ее выполнения. /about yet not flushed writes/ она заставляет все размещенные записи в процессоре смываться во внешнюю память перед выполнением следующей инструкции.

/о SMP/ семафор находится в кэше в состоянии S... выдавая транзакцию чтения и аннулирования для 0 байт даты (это убийство/ общих копий строки кэша в соседних процессорах/)

4
ответ дан 24 November 2019 в 10:19
поделиться
Другие вопросы по тегам:

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