Как работают память заборов?

Мне нужно понимать память заборов в многокатечных машинах. Скажем, у меня есть этот код

CORE 1

mov [_x], 1; mov r1, [_y]    

CORE 2

mov [_y], 1; mov r2, [_x]

Теперь неожиданные результаты без памяти заборов было бы то, что как R1, так и R2 могут составлять 0 после выполнения. На мой взгляд, чтобы противостоять этой проблеме, мы должны поставить забор памяти в обоих кодах, когда положив его только к тому, что все равно не решит проблему. Что-то вроде следующим образом ...

CORE 1

mov [_x], 1; memory_fence; mov r1, [_y]  

CORE 2

mov [_y], 1; memory_fence; mov r2, [_x]

Является ли мое понимание правильно или я еще что-то упустить? Предположим, что архитектура X86. Кроме того, кто-нибудь может сказать мне, как поставить память заборов в C ++ код?

24
задан MetallicPriest 2 September 2011 в 07:29
поделиться

1 ответ

Ограждения сериализуют операцию, которую они ограждают (загружают и хранят), то есть никакая другая операция не может начаться до тех пор, пока ограждение не будет выполнено, но ограждение не будет выполняться, пока все предыдущие операции не будут завершены. цитирование intel делает это немного более точным (взято из инструкции MFENCE, стр. 3-628, том 2A, справочник Intel):

Эта операция сериализации гарантирует, что каждая загрузка и сохранение Инструкция, которая предшествует инструкции MFENCE в программном порядке, становится глобально видимой перед любой инструкцией загрузки или сохранения, которая следует за инструкцией MFENCE.1

  1. Инструкция загрузки считается видимой глобально, когда значение, которое должно быть загружено в его регистр назначения определен.

Использование заборов в C ++ сложно (C ++ 11 может иметь семантику заборов где-то, может быть, у кого-то еще есть информация об этом), так как это зависит от платформы и компилятора. Для x86 с использованием MSVC или ICC вы можете использовать _mm_lfence, _mm_sfence & amp; _mm_mfence для загрузки, хранения и загрузки + хранения ограждения (обратите внимание, что некоторые из них являются инструкциями SSE2).

Примечание: это предполагает перспективу Intel, то есть: использующую процессор x86 (32 или 64 бит) или IA64

14
ответ дан 29 November 2019 в 00:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: