2014-12-14 2 views
8

Большинство архитектур процессоров будут переупорядочивать операции загрузки-загрузки, но почему мой вопрос? Моя интерпретация барьера магазина нагрузка будет выглядеть следующим образом:Почему барьер для хранения данных считается дорогостоящим?

x = 50; 
store_load_barrier; 
y = z; 

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

ответ

12

Краткий ответ: Защитный барьер-хранилище предотвращает спекулятивное выполнение процессором LOAD, возникающего после барьера на складе, до тех пор, пока все предыдущие магазины не будут завершены.

Детали:

Причина, по которой барьер магазин нагрузки дорого это предотвращает изменение порядка загрузки и сохранения операций через барьер.

Предположим, вы имели последовательность команд, как следующее:

...    ;; long latency operation to compute r1 
ST r1, [ADDR1] ;; store value in r1 to memory location referenced by ADDR1 
LD r3, [ADDR2] ;; load r3 with value in memory location ADDR2 
...    ;; instructions that use result in r3 

Когда эта последовательность выполняет, что значение r1 будет результатом операции, которые занимают много времени, чтобы закончить. Инструкция ST r1, [ADDR1] должна останавливаться до тех пор, пока не будет прочитано r1. В то же время процессор не по порядку может спекулятивно выполнять LD r3, [ADDR2] и другие инструкции, если они не зависят от более раннего хранилища. Они фактически не будут зафиксированы до тех пор, пока хранилище не будет выполнено, но, выполняя большую часть работы, результаты могут быть сохранены в буфере переупорядочения и готовы к фиксации быстрее.

Это работает для однопроцессорной системы, потому что CPU может проверить, существуют ли зависимости между ADDR1 и ADDR2. Но в многопроцессорной системе несколько процессоров могут самостоятельно выполнять нагрузки и хранилища. Могут быть несколько процессоров, которые выполняют ST для ADDR1 и LD из ADDR2. Если процессоры могут спекулятивно выполнять эти инструкции, которые, как представляется, не имеют зависимостей, тогда разные процессоры могут видеть разные результаты. Я думаю, что following blog post дает хорошее объяснение того, как это может произойти (я не думаю, что это то, что я мог бы кратко изложить в этом ответе).

Теперь рассмотрим последовательность кода, который имеет барьер магазин нагрузки:

...    ;; long latency operation to compute r1 
ST r1, [ADDR1] ;; store value in r1 to memory location referenced by ADDR1 
ST_LD_BARRIER ;; store-load barrier 
LD r3, [ADDR2] ;; load r3 with value in memory location ADDR2 
...    ;; instructions that use result in r3 

Это предотвратить LD r3, [ADDR2] инструкции и следующие зависимые инструкции от не быть спекулятивно выполняется до тех пор, предыдущие инструкции магазина полный. И это может снизить производительность ЦП, потому что весь процессорный конвейер может остановиться, ожидая завершения инструкции ST, хотя в самом процессоре нет зависимости между LD и ST.

Есть некоторые вещи, которые можно сделать, чтобы ограничить количество, которое CPU должен остановить. Но суть в том, что барьер для хранения нагрузки создает дополнительные зависимости между нагрузками и хранилищами, и это ограничивает объем спекулятивного выполнения, который может выполнять ЦП.

+0

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

+0

@William, да значение магазина будет перенаправлено на зависимую нагрузку, когда это возможно. Вот ссылка [http: //blog.stuffedcow.net/2014/01/x86-memory-disamiguation /), который дает более подробную информацию. –

+0

Отличный ответ. Что касается комментариев - неоднозначность памяти требуется только тогда, когда адреса еще не известны, но даже если они есть - все еще есть длинное окно для пересылки, если хранилище пропускает кеши и переходит в память. – Leeor