2014-10-10 3 views
6

Во-первых, некоторый контекст: я работаю с моделью на основе pre-C11, inline-asm, но для этого я с удовольствием игнорирую C-аспект (и любой компилятор-барьер вопросов, с которыми я могу иметь дело отдельно) и рассматриваем его по существу как вопрос архитектуры asm/cpu.Возможно ли использовать барьеры памяти только на стороне хранения

Предположим, что у меня есть код, который выглядит примерно так:

various stores 
barrier 
store flag 
barrier 

Я хочу, чтобы иметь возможность читать flag из другого ядра процессора и сделать вывод, что various stores были уже выполнены и сделаны видимыми. Возможно ли это сделать без какой-либо инструкции по защите памяти на стороне загрузки? Очевидно, что это возможно, по крайней мере, на некоторых архитектурах процессора, например x86, где явный барьер памяти не нужен ни для одного ядра. Но что вообще? Разве это сильно варьируется в cpu arch, возможно ли это?

+0

AFAIK, Alpha нуждается в барьерах, в то время как ARM/PPC нужны либо барьеры, либо зависимости по адресам/данным, либо зависимости управления RW, либо отношения управления RR + ISYNC/ISB между чтением флага и операцией, которая зависит от него. Для ARM/PPC вас может заинтересовать «Введение в модели ARM и POWER Relaxed Memory». – ninjalj

+0

Другая точка данных: согласно предложению заказа памяти для хранения по адресу http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1444.htm, некоторые встроенные процессоры MIPS также могут избежать барьеров за счет использования зависимостей (более старые, «истинные» MIPS предположительно seq-cst). Кроме того, учитывая, что 'smp_read_barrier_depends()' в ядре Linux является лишь барьером для Alpha, кажется, что если есть зависимость (возможно, поддельная) адреса от стороны чтения, можно избежать барьера чтения (за исключением Alpha). Создание компилятора для сохранения зависимости - это еще одна проблема. – ninjalj

ответ

3

Если CPU должен был переупорядочить нагрузки, для корректной работы вашего кода потребуется барьер нагрузки. Существует множество архитектур, которые выполняют такое переупорядочение; в некоторых примерах см. таблицу в Memory ordering.

Таким образом, в общем случае для вашего кода требуются барьеры нагрузки.

x86 не очень типичен тем, что обеспечивает довольно строгие гарантии порядка памяти. См. Who ordered memory fences on an x86? для обсуждения.

+0

Возможно ли переупорядочить нагрузки, если одна из нагрузок даже происходит, зависит от значения, загруженного другим? Конечно, такое переупорядочение не может происходить на уровне компилятора (потому что это может вызвать сбои нагрузки), но, возможно, процессор может спекулятивно выполнять нагрузки, которые потенциально могут быть повреждены, и просто отложить ошибку? –

+0

Спасибо за ссылку «Кто заказал забор памяти на x86». Очень интересно читать - я всегда задавался вопросом, почему, с сильными гарантиями заказа, уже была добавлена ​​явная инструкция забора. –

+0

Вот еще одна интересная лекция, которая может объяснить вещи - http://channel9.msdn.com/Shows/Going+Deep/Cpp-and-Beyond-2012-Herb-Sutter-atomic-Weapons-2-of-2 – Leeor

Смежные вопросы