Насколько быстрый доступ к атомарным переменным в C ++ - PullRequest
9 голосов
/ 29 августа 2011

Мой вопрос заключается в том, как быстро осуществляется доступ к атомарным переменным в C ++ с помощью класса C ++ 0x actomic <>? Что идет вниз на уровне кеша. Скажем, если один поток просто читает его, нужно ли ему загружаться в ОЗУ или он может просто читать из кэша ядра, в котором он выполняется? Предположим, что архитектура x86.

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

Ответы [ 3 ]

3 голосов
/ 29 августа 2011

Если вы хотите сырые числа, списки данных Anger Fog из его руководств по оптимизации должны быть полезны, также, руководства по intels имеют несколько разделов, подробно описывающих задержки для чтения / записи в памятьв многоядерных системах, которые должны включать сведения о замедлениях, вызванных блокировкой шины, необходимой для атомарной записи.

3 голосов
/ 29 августа 2011

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

См. Также Спецификации производительности примитивов синхронизации .NET или Windows

0 голосов
/ 03 сентября 2013

Atomics использует специальную поддержку архитектуры, чтобы получить атомарность, не заставляя все операции чтения / записи идти до основной памяти.По сути, каждому ядру разрешено проверять кеши других ядер, поэтому они таким образом узнают о результатах операций других потоков.На x86 МНОГИЕ операции уже были атомарными, поэтому они бесплатны.Я видел числа от 10 до 100 циклов, в зависимости от архитектуры и работы.С точки зрения перспективы, любое чтение из основной памяти занимает 3000-4000 циклов, поэтому атомы работают НАМНОГО быстрее, чем переход к памяти почти на всех платформах.

...