Это дополнительный вопрос к этому вопросу . Я реализую дополнительную атомарную операцию, которую я назвал load_strong
, которая использует внутри атомарную операцию RMW, чтобы использовать гарантию стандарта C ++, что извлекается последнее записанное глобальное значение (что является более сильной гарантией, чем просто атомарная загрузка). , который может читать старые значения).
Какова производительность неудачного сравнения_обмена_стронг по сравнению с успешным сравнением_обмена_стронг с обычным обменом на различных платформах? & emsp;
Я думаю, что неуспешный Compare_exchange_strong потенциально может быть быстрее на некоторых платформах, чем на успешной, так как выбирается только самое новое значение и не нужно записывать значение. На IA32 даже неудачный обмен сравнениями выполняет атомарную запись (запись старого значения) [1] .
В некоторых случаях атомный обмен также будет работать, т. Е. При проверке значения атомарной переменной, и есть только один «потребитель», пытающийся когда-либо прочитать значение. Является ли атомарный обмен обычно быстрее, чем compare_exchange_strong (поскольку нет необходимости сравнивать)?
В настоящее время я реализую его следующим образом (Atomic<T>
происходит от std::atomic<T>
):
template<class T>
T Atomic<T>::load_strong(std::memory_order order)
{
T expected = T();
std::atomic<T>::compare_exchange_strong(
expected,
expected,
order,
order);
return expected;
}
Если обмен атомами происходит быстрее, чем в описанной выше реализации, я должен также представить специализированную более быструю версию load_strong
, которая не сохраняет значение атома и использует атомный обмен.
Также относится: Есть ли прирост производительности при использовании атомных нагрузок вместо RMW для вращения? & emsp;
Как только я сделаю load_strong, я гарантированно узнаю самое последнее значение атома. Если я нахожусь в ситуации, когда у меня есть гарантия, что после моей load_strong может произойти только одна внешняя запись, то будет ли разница в производительности других потоков в зависимости от того, использую ли я load_strong (или его потенциально более быструю версию) или атомарную загрузку раскрутить для того, чтобы написать?
Речь идет не о производительности вращающегося потока, а о том, как выбор операции влияет на другие потоки. Я спрашиваю об этом, потому что на x86 атомарные нагрузки являются простыми и не используют префикс блокировки (насколько я знаю). Если я никогда не использую префикс блокировки во время вращения, кажется интуитивно понятным, что другие потоки не получат никакого снижения производительности от моего вращения.
Это правда? Как это работает на разных архитектурах?