Эффект / заполнение std :: memory_order_ * на x86 (-64)

У меня такой код:

#include <cstdint>
#include <atomic>

void myAtomicStore(std::atomic<int32_t>& i, const int32_t v) {
    i.store(v, std::memory_order_release);
}

int myAtomicLoad(std::atomic<int32_t>& i, const int32_t v) {
    return i.load(std::memory_order_acquire);
}

И (согласно this) GCC 8.1 перевел его (для x86_64) на:

myAtomicStore(std::atomic<int>&, int):
        mov     DWORD PTR [rdi], esi
        ret
myAtomicLoad(std::atomic<int>&, int):
        mov     eax, DWORD PTR [rdi]
        ret

Интересно, как инструкции mov могут сделать все записи в память до того, как myAtomicStore() станут видимыми для другого потока, когда он вызывает myAtomicLoad() для той же переменной (или области памяти) - гарантированно стандартом C ++.

Я просмотрел Руководство Intel; и я не вижу ничего очевидного.

Спасибо!


person HCSF    schedule 09.07.2018    source источник
comment
У вас нет другого кода. Вакуумно не выходит из строя   -  person Caleth    schedule 09.07.2018
comment
@Caleth: причина не в этом (кроме переупорядочения во время компиляции). хранилища релизов применяются и к хранилищам в вызывающей функции. Причина в том, что сильная модель памяти x86 делает каждое хранилище хранилищем выпуска, а каждую загрузку - загрузкой захвата, поэтому компилятору не нужны дополнительные инструкции. preshing.com/20120930/weak-vs-strong-memory-models. См. Также (preshing.com/20120515/memory-reordering-caught- в действии. В поисках дубликата Q IIRC некоторые цитируют правила упорядочивания памяти Intel из руководства.   -  person Peter Cordes    schedule 09.07.2018
comment
Возможный дубликат Есть ли смысл использовать инструкцию LFENCE на процессорах x86 / x86_64?   -  person Peter Cordes    schedule 09.07.2018
comment
В верхнем ответе об этом дубликате цитируется раздел 8.2.2 Intel SDM с правилами упорядочивания памяти, запрещающими любое переупорядочение, кроме StoreLoad. . См. Также Атомарные операции, std :: atomic ‹› и порядок записи и Состояние гонки на x86 и Помогает ли процессор x86 переупорядочивать инструкции? и память -заказные ссылки в вики-странице тегов x86: stackoverflow.com/tags/x86/info   -  person Peter Cordes    schedule 09.07.2018
comment
@PeterCordes Спасибо за ссылки. Думаю, я понял - x86 не позволяет ЦП переупорядочивать записи (за некоторыми исключениями, упомянутыми в вашем последнем ссылка); следовательно, серия простых mov уже выполнила гарантию, упомянутую в стандарте C ++. Спасибо!   -  person HCSF    schedule 09.07.2018
comment
Да, обычные загрузки / сохранения имеют семантику acquire и release, но не seq_cst. Для этого вам нужно mfence, а лучше xchg [mem], eax, чтобы создать хранилище с последовательным выпуском. (И, конечно же, операции RMW всегда seq_cst на x86 по крайней мере по сравнению с переупорядочением времени выполнения (переупорядочение времени компиляции все еще возможно для mo_relaxed). См. Может ли num ++ быть атомарным для 'int num'?: вам нужно lock add в многоядерной системе.)   -  person Peter Cordes    schedule 09.07.2018
comment
@PeterCordes Хотя вы уже ответили на этот вопрос, обратите внимание, что главный ответ на этот возможный дубликат в основном неверен.   -  person Hadi Brais    schedule 09.07.2018
comment
@HadiBrais: хм, да, Есть ли у x86-SSE-инструкций автоматический порядок выпуска-получения?, который цитирует то же самое, не делая ложных утверждения о lfence + sfence могут быть более удачной целью для дублирования.   -  person Peter Cordes    schedule 09.07.2018
comment
@HadiBrais: Я отредактировал принятый ответ на первый вопрос, который я связал, потому что это, возможно, лучшая цель дублирования для этого вопроса.   -  person Peter Cordes    schedule 09.07.2018
comment
@PeterCordes Добавленная вами ссылка - в значительной степени самая полезная вещь в ответе (в частности, ваш ответ там). Что касается другого одного , только немного лучше, но все же неточно / неполно, потому что в нем не говорится об атомарности. Есть ли какой-либо ответ на SO, который четко и точно объясняет, когда и почему инструкции x86 имеют семантику получения и / или выпуска? ...   -  person Hadi Brais    schedule 09.07.2018
comment
... Даже в статье Прешинга, похоже, только смутно сказано *usually*, every load on x86/64 already implies acquire semantics and every store implies release semantics. This is why x86/64 is *often* said to be strongly ordered. (курсив мой).   -  person Hadi Brais    schedule 09.07.2018
comment
@PeterCordes Я потратил несколько часов на некоторые из ваших ссылок ... все еще не могу закончить все. Все, что могу сказать - приятные ответы! Спасибо, что поделился. (Продолжить чтение)   -  person HCSF    schedule 09.07.2018