Атомарность загрузок и хранилищ на 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. Но он отвечает за правильный порядок памяти, а не за атомарность. Вот и все. Кажется, что он не «пропускает» кеш.
Я знаю, что перемещение выровненных целых чисел, например целых чисел, в память является атомарным. Однако я в замешательстве.
Итак, я высказал свои сомнения, но главный вопрос:
Как процессор реализует атомарные операции внутри себя?
Подробнее здесь: 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. Но он отвечает за правильный порядок памяти, а не за атомарность. Вот и все. Кажется, что он не «пропускает» кеш.
Я знаю, что перемещение выровненных целых чисел, например целых чисел, в память является атомарным. Однако я в замешательстве.
Итак, я высказал свои сомнения, но главный вопрос:
Как процессор реализует атомарные операции внутри себя?
Подробнее здесь: https://stackoverflow.com/questions/384 ... res-on-x86
Мобильная версия