Два последовательных хранилища ЦП на x86 сброшены в кеш, сохраняя порядок? - PullRequest
6 голосов
/ 16 января 2012

Предположим, что на x86 CPU0 и CPU1 работают два потока соответственно. Поток, работающий на CPU0, выполняет следующие команды:

A=1
B=1

Строка кэша, содержащая A, изначально принадлежавшая CPU1, и строка, содержащая B, принадлежащая CPU0.

У меня есть два вопроса:

  1. Если я правильно понимаю, оба хранилища будут помещены в буфер хранилища ЦП. Однако для первого хранилища A=1 кэш CPU1 должен быть недействительным, в то время как второе хранилище B=1 может быть немедленно очищено, поскольку CPU0 владеет строкой кеша, содержащей его. Я знаю, что процессор x86 уважает заказы магазинов. Означает ли это, что B=1 не будет записан в кеш до A=1?

  2. Предположим, что в CPU1 выполняются следующие команды:

while (B = 0);
печать A

Достаточно ли добавить только lfence между командами while и print в CPU1 без добавления sfence между A=1 и B=1 в CPU0, чтобы 1 всегда выводился на x86?

while (B=0);
lfence
print A

1 Ответ

8 голосов
/ 16 января 2012

В x86 записи одним процессором наблюдаются в одном и том же порядке всеми процессорами.Не нужно фехтовать ни в вашем примере, ни в любой нормальной программе на x86.Ваша программа:

while(B==0);  // wait for B == 1 to become globally observable
print A;      // now, A will always be 1 here

Что именно происходит в кеше, зависит от модели.В кеше могут происходить всевозможные уловки и спекулятивные действия, но поведение наблюдаемое всегда соответствует правилам.

См. Руководство по системному программированию Intel, том 3, раздел 8.2.2.для деталей по упорядочению памяти.

...