Какова стоимость атомарной операции (какой-либо из сравнивать-и-подкачивать, или атомарные добавляют/постепенно уменьшают)? Сколько циклов это использует? Действительно ли это приостановит другие процессоры на SMP или NUMA, или будет это доступы памяти блока? Это сбросит буфер восстановления последовательности в неисправном ЦП?
Чем эффекты будут в кэше?
Я интересуюсь современными, популярными центральными процессорами: x86, x86_64, PowerPC, SPARC, Itanium.
Я искал фактические данные за последние дни и ничего не нашел. Однако я провел небольшое исследование, в котором сравнивается стоимость атомарные операции с затратами на промахи кеша.
Стоимость префикса 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), где это необходимо, объясняется ниже. Сценарий, как объясняется, следующий:
Во всех случаях запрос строки кэша может быть остановлен другими процессорами, уже изменяющими данные.
В 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 байт даты (это убийство/ общих копий строки кэша в соседних процессорах/)