2016-03-01 3 views
1

В x86/x64 инструкции для временного хранения, такие как MOVNTI и MOVNTPS, обеспечивают более низкие гарантии порядка памяти, чем «обычные» магазины. Я понимаю, что заборы (например, SFENCE) необходимы при совместном использовании памяти, которая будет записана на не-временные потоки. Тем не менее, необходимы ли какие-либо инструкции по заграждению для потоковой локальной памяти? Если я пишу в папку через MOVNTPS, является ли запись гарантированной видимой для последующих инструкций в том же потоке без какой-либо инструкции по заграждению?x86 Non-Temporal Инструкции: требуется ли фехтование для локальных данных?

+0

Одна нить ** всегда ** наблюдает за своими * действиями в программном порядке. Основным правилом нестандартных процессоров является то, что они всегда ведут себя так, как если бы ваш код выполнялся в программном порядке. (Единственным исключением является то, что архитектура имеет другие правила: например, IA-64 был экспериментом в явном параллелизме, где каждый блок команд VLIW выполнялся параллельно. Таким образом, вы могли бы сделать обмен с помощью '{a = b, b = a} 'в том же блоке инструкций или что-то в этом роде. Думаю, слот задержки задержки в некоторых RISC-архитектурах является еще одним примером.) –

+0

Вероятно, не существует ISA, где однопоточный код должен ничего обойти. Ядра могут легко скрыть собственные буферы хранилища. –

ответ

3

Да, они будут видны без заборов. Смотрите раздел Заказ 8.2.2 памяти в Р6 и более современных семейств процессоров в IA-32 Архитектуры Руководство Том 3A программного обеспечения разработчика на Intel® 64 и: Руководство по системному программированию, часть 1, который говорит, в частности:

для областей памяти, определяемых как кэшируемые для записи, [...] Считывание может быть переупорядочено с помощью более старых записей в разные местоположения, но не со старыми записями в том же месте.

и

Записывает в память не переупорядоченной с другими записями, с следующими исключениями: - потоковое магазины (пишет) выполняется с не-временных сдвигают (MOVNTI, MOVNTQ , MOVNTDQ, MOVNTPS и MOVNTPD);