стоимость атомной операции

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

Какие эффекты будут на кеше?

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

75 голосов | спросил osgx 29 MarpmMon, 29 Mar 2010 17:11:25 +04002010-03-29T17:11:25+04:0005 2010, 17:11:25

3 ответа


0

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

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

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

Прежде чем вдаваться в подробности, я скажу, что операция LOCKed стоит одного промаха кеша + возможный конфликт с другим процессором на той же кеш-линии, а CAS + предшествующая загрузка (что почти всегда требуется, кроме мьютексов, где вы всегда CAS 0 и 1) может стоить два промаха кэша.

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

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

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

ответил Blaisorblade 6 Maypm10 2010, 23:50:50
0

Я провел некоторое профилирование со следующей настройкой: тестовая машина (AMD Athlon64 x2 3800+) была загружена, переключена в длинный режим (прерывания отключены), и интересующая инструкция была выполнена в цикле, развернутых 100 итераций и цикле 1000 циклы. Тело цикла было выровнено до 16 байтов. Время измерялось с помощью инструкции rdtsc до и после цикла. Кроме того, был выполнен фиктивный цикл без какой-либо инструкции (который измерял 2 цикла на итерацию цикла и 14 циклов для остальных), и результат был вычтен из результата времени профилирования инструкции.

Были измерены следующие инструкции:

  • "lock cmpxchg [rsp - 8], rdx" (как с сопоставлением, так и с несовпадением),
  • "lock xadd [rsp - 8], rdx",
  • "lock bts qword ptr [rsp - 8], 1" литий>

Во всех случаях измеренное время составляло около 310 циклов, ошибка составляла около +/- 8 циклов

Это значение для повторного выполнения в той же (кэшированной) памяти. С дополнительным отсутствием кэша время значительно выше. Кроме того, это было сделано только с одним из двух активных ядер, поэтому кеш принадлежал исключительно, и синхронизация кеша не требовалась.

Чтобы оценить стоимость заблокированной инструкции в случае пропуска кэша, я добавил инструкцию wbinvld перед заблокированной инструкцией и поставил ---- +: = 4 =: + ---- плюс wbinvld в цикл сравнения. В обоих случаях стоимость составляла около 80 000 циклов на пару инструкций! В случае блокировки bts разница во времени составляла около 180 циклов на инструкцию.

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

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

Для загрузки машины я использовал версию FreeLdr x64 из проекта ReactOS. Вот исходный код asm:

add [rsp - 8], rax
ответил Timo 21 PMpSun, 21 Apr 2013 19:04:17 +040004Sunday 2013, 19:04:17
0

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

Ppro & Книга P2 http://books.google.com/books?id=3gDmyIYvFH4C&pg=PA245&dq=lock+instruction+pentium&lr= & ei = _E61S5ehLI78zQSzrqwI & cd = 1 # v = одна страница & q = блокировка% 20инструкция% 20pentium & f = false страницы 244-246

  

Заблокированные инструкции - это сериализация, синхронизация операций ....   /about Out-of-order /заблокированный RMW /read-modify-write = atomic самой /инструкция гарантирует, что процессор выполнит все инструкции до заблокированной инструкции до ее выполнения.   /о еще не очищенных записях /заставляет все записанные записи в процессоре записываться во внешнюю память перед выполнением следующей инструкции.

     

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

ответил osgx 2 AMpFri, 02 Apr 2010 06:41:05 +040041Friday 2010, 06:41:05

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132