2014-12-17 1 views
2

Я нашел документ Intel, в котором говорится, что барьеры памяти требуются, когда используется строка (а не std::string, но инструкции инструкции сборки), чтобы предотвратить их переупорядочение CPU.Достаточно ли протокола MESI, или еще существуют барьеры памяти? (Процессоры Intel)

Однако существуют ли барьеры памяти, когда два потока (на двух разных ядрах) получают доступ к одной и той же памяти? Сценарий, который я имел в виду, - это тот, где один из процессоров, которые не «владеют» линией кэша, записывает в эту память, а ядро ​​записывает в свой буфер хранилища (в отличие от его кеша). Для сброса значения из буфера хранилища в кэш требуется барьер памяти, поэтому другое ядро ​​может получить это значение?

Я не уверен, обрабатывает ли это протокол Intel по протоколу MESI?

(то, что я пытался (плохо) объяснить выше, лучше описано в следующей статье, страницы 6-12):

http://www.puppetmastertrading.com/images/hwViewForSwHackers.pdf

выше документ является очень общим, и я не уверен, как Процессоры Intel практически справляются с этой проблемой.

+0

Я думаю, вы говорите об улучшенной функции «rep movs» от IvyBridge (ERMSB). Он использует слабо упорядоченные записи, но вам не нужны барьеры, если вы не копировали вручную. (см. мой ответ) –

ответ

3

Протоколы MESI применяются к кэшам, сохранение буферизации по существу является предварительным кэшем, что означает, что это хранилище, которое еще не было «выпущено» во внешний мир, и его точка синхронизации еще не определена.

Вы также должны иметь в виду, что согласованность кеш гарантирует, что записи не будут выполняться при устаревших копиях кешины и потеряться на этом пути. Единственной гарантией таких протоколов является скрыть тот факт, что у вас есть кеши с скопированными значениями (сама по себе оптимизация производительности) и выставляете программисту/ОС иллюзию одноуровневой плоской физической памяти.

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

Описанная вами ситуация невозможна, так как она разбивает первую часть - ядро, которое не владеет линией, не может записывать в память, так как оно пропускает обновленные данные в ядре, которое владеет линией (если такое существует). Что произойдет в рамках протокола MESI, так это то, что запись будет буферизована на некоторое время, и когда ее очередь будет выпущена, она отправит запрос на владение, который приведет к аннулированию всех копий этой строки в других ядрах (запуск обратной записи, если есть модифицированная копия) и извлекать обновленные данные. Только тогда ядро ​​писателя может изменить строку и пометить ее как измененную.

Однако, если два ядра записываются в одну и ту же строку одновременно, протокол MESI гарантирует только то, что эти записи будут иметь номер, а не конкретный, который вы, возможно, захотите. Хуже того, если каждое ядро ​​пишут несколько строк и вы хотите атомарность вокруг этих записей, MESI этого не гарантирует. Вам нужно будет активно добавлять мьютекс или какой-либо барьер, чтобы заставить HW выполнять записи так, как вы хотите.

+0

Не могли бы вы взглянуть на опубликованную мной статью? Я в основном пытаюсь понять, является ли это всего лишь какой-то академической глупостью или проблема, о которой идет речь, происходит в реальном мире на процессорах Intel? – user997112

+0

Просто фактоид: x86 имеет несколько сильную модель согласованности памяти (но не последовательную согласованность), поэтому в некоторых случаях для x86 не требуется никакого барьера памяти, где это необходимо для ARM или Power. –

+0

@ PaulA.Clayton, правда, но это не связано с MESI (которые оба могут использовать и на самом деле являются микроархитектурным аспектом) – Leeor

1

Я думаю, что вы говорите об ERMSB (быстрых строках) в Intel IvB, а затем, делая rep movs, используют слабо упорядоченные записи.

My conclusion from Intel's docs является то, что вы до сих пор не нужны SFENCE заказать эти магазины относительно других магазинов, и, конечно, вы не можете запустить SFENCE в середине rep movsb. Посмотрите на этот ответ, чтобы узнать больше о проблемах с памятью на x86.

AFAICT, все, что вам нужно сделать, это избежать, используя тот же rep movs писать буфер и флаг, что читатели будут проверять, если буфер готов. Читатель мог видеть флаг перед тем, как все хранилища в буфер будут видны ему. Это единственный способ, которым новая функция ERMSB влияет на правильность, для программ, которые были уже правильными (т. Е. Не зависели от временных ограничений). Это положительно влияет на производительность для memcpy/memset.

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