Атомарность загрузок и хранилищ на x86 ⇐ C++
-
Anonymous
Атомарность загрузок и хранилищ на x86
8.1.2 Блокировка шины
Процессоры Intel 64 и IA-32 предоставляют сигнал LOCK#, который устанавливается
автоматически при использовании определенной критической памяти операции по блокировке
системной шины или эквивалентного канала. Пока этот выходной сигнал активен,
запросы от других процессоров или агентов шины на управление шиной
блокируются. Программное обеспечение может указать другие случаи, когда семантика LOCK
должна следовать, путем добавления префикса LOCK к
инструкции.
Оно взято из руководства Intel, том 3.
Похоже, что атомарные операции с памятью будут выполняться непосредственно в памяти (ОЗУ). Я в замешательстве, потому что не вижу «ничего особенного», когда анализирую выходные данные сборки.
По сути, выходные данные сборки, сгенерированные для std::atomic X; X.load() — это обычная загрузка mov. И если я правильно понимаю, X.store(2) — это просто mov [где-то], 2 плюс mfence, если это seq_cst. Но он отвечает за правильный порядок памяти, а не за атомарность. Вот и все. Кажется, что он не «пропускает» кеш.
Я знаю, что перемещение выровненных целых чисел, например целых чисел, в память является атомарным. Однако я в замешательстве.
Итак, я высказал свои сомнения, но главный вопрос:
< strong>Как процессор выполняет внутренние атомарные операции?
Подробнее здесь: https://stackoverflow.com/questions/384 ... res-on-x86
8.1.2 Блокировка шины
Процессоры Intel 64 и IA-32 предоставляют сигнал LOCK#, который устанавливается
автоматически при использовании определенной критической памяти операции по блокировке
системной шины или эквивалентного канала. Пока этот выходной сигнал активен,
запросы от других процессоров или агентов шины на управление шиной
блокируются. Программное обеспечение может указать другие случаи, когда семантика LOCK
должна следовать, путем добавления префикса LOCK к
инструкции.
Оно взято из руководства Intel, том 3.
Похоже, что атомарные операции с памятью будут выполняться непосредственно в памяти (ОЗУ). Я в замешательстве, потому что не вижу «ничего особенного», когда анализирую выходные данные сборки.
По сути, выходные данные сборки, сгенерированные для std::atomic X; X.load() — это обычная загрузка mov. И если я правильно понимаю, X.store(2) — это просто mov [где-то], 2 плюс mfence, если это seq_cst. Но он отвечает за правильный порядок памяти, а не за атомарность. Вот и все. Кажется, что он не «пропускает» кеш.
Я знаю, что перемещение выровненных целых чисел, например целых чисел, в память является атомарным. Однако я в замешательстве.
Итак, я высказал свои сомнения, но главный вопрос:
< strong>Как процессор выполняет внутренние атомарные операции?
Подробнее здесь: https://stackoverflow.com/questions/384 ... res-on-x86
Мобильная версия