Во-первых, некоторый контекст: я работаю с моделью на основе pre-C11, inline-asm, но для этого я с удовольствием игнорирую C-аспект (и любой компилятор-барьер вопросов, с которыми я могу иметь дело отдельно) и рассматриваем его по существу как вопрос архитектуры asm/cpu.Возможно ли использовать барьеры памяти только на стороне хранения
Предположим, что у меня есть код, который выглядит примерно так:
various stores
barrier
store flag
barrier
Я хочу, чтобы иметь возможность читать flag
из другого ядра процессора и сделать вывод, что various stores
были уже выполнены и сделаны видимыми. Возможно ли это сделать без какой-либо инструкции по защите памяти на стороне загрузки? Очевидно, что это возможно, по крайней мере, на некоторых архитектурах процессора, например x86, где явный барьер памяти не нужен ни для одного ядра. Но что вообще? Разве это сильно варьируется в cpu arch, возможно ли это?
AFAIK, Alpha нуждается в барьерах, в то время как ARM/PPC нужны либо барьеры, либо зависимости по адресам/данным, либо зависимости управления RW, либо отношения управления RR + ISYNC/ISB между чтением флага и операцией, которая зависит от него. Для ARM/PPC вас может заинтересовать «Введение в модели ARM и POWER Relaxed Memory». – ninjalj
Другая точка данных: согласно предложению заказа памяти для хранения по адресу http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1444.htm, некоторые встроенные процессоры MIPS также могут избежать барьеров за счет использования зависимостей (более старые, «истинные» MIPS предположительно seq-cst). Кроме того, учитывая, что 'smp_read_barrier_depends()' в ядре Linux является лишь барьером для Alpha, кажется, что если есть зависимость (возможно, поддельная) адреса от стороны чтения, можно избежать барьера чтения (за исключением Alpha). Создание компилятора для сохранения зависимости - это еще одна проблема. – ninjalj