не удалось против успешного сравнения_обмена_стронг против обмена - PullRequest
0 голосов
/ 15 марта 2019

Это дополнительный вопрос к этому вопросу . Я реализую дополнительную атомарную операцию, которую я назвал 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 атомарные нагрузки являются простыми и не используют префикс блокировки (насколько я знаю). Если я никогда не использую префикс блокировки во время вращения, кажется интуитивно понятным, что другие потоки не получат никакого снижения производительности от моего вращения.
Это правда? Как это работает на разных архитектурах?

...