2015-09-15 4 views
2

Я погружаюсь в многопоточное программирование и задумываюсь о бесконтактном подсчете ссылок с использованием атомных операций.Насколько дороги атомные операции?

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

Интересно, влияет ли (если, и сколько) выполнение атомарные операции на ядре А производительность других ядер, которые:

  1. не имеют никакого отношения, связанные с сердцевиной
  2. выполняются различные нити того же процесса в качестве сердечника
  3. выполняются атомарной операции
  4. выполняются атомарной операции и выполняются различные нити того же процесса, как сердцевиной
  5. выполняются любые памяти г приподнятая операция, т.е. нагрузка, магазин, ...
  6. выполняются любые операции, связанные с памятью в той же области памяти (строки кэша, страницы?) в ядре A
+1

Возможный дубликат [атомная эксплуатационная стоимость] (https://stackoverflow.com/questions/2538070/atomic-operation-cost) – Tijmen

ответ

2

Многие люди думают, что атомарные операции дешевы. Однако это не обязательно верно, поскольку атомарная операция является обобщением. Есть 3 основных типа атомарных операций:

  1. Атомные сохранить
  2. атомной нагрузки
  3. Atomic CompareAndSet (увеличение/уменьшение/и т.д.)

Первые два, как правило, более или менее дешевы (или, как мы все знаем, имеют ту же стоимость, что и их неатомные друзья на Intel). Они накладывают барьеры памяти, но барьеры относятся только к процессору, который их выполняет, а процессоры прилагают все усилия, чтобы сделать барьеры эффективными. Тем не менее, третий может быть не так дешев в споре. Atomic CAS и друзья фактически выполняют операцию в цикле до тех пор, пока не преуспеют, поэтому в процессе обсуждения может потребоваться значительное время для выполнения операции.

1

Я сравниваю операцию атомного чтения-модификации-записи с соответствующей неатомной операцией на современных процессорах x86.

не имеет никакого отношение, связанные с сердцевиной

Нет эффект.

не выполняются различные нити того же процесса, как сердечник A

Отсутствие эффекта.

выполняются атомарные операции

Нет эффекта.

выполняются атомарной операции и не выполняются различные нити того же процесса, как сердечник A

Отсутствие эффекта.

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

Отсутствие эффекта.

выполняется какая-либо связанная с работой памяти в том же области памяти (строки кэша, страницы?) В качестве ядра Линии

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

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