Два последовательных хранилища ЦП на x86 сброшены в кеш, сохраняя порядок?
Предположим, что на x86 CPU0 и CPU1 работают два потока соответственно. Поток, работающий на CPU0, выполняет следующие команды:
A=1
B=1
Строка кэша, содержащая A, изначально принадлежащая CPU1, и строка, содержащая B, принадлежащая CPU0.
У меня есть два вопроса:
Если я правильно понимаю, оба хранилища будут помещены в буфер хранилища ЦП. Однако для первого магазина
A=1
кэш CPU1 должен быть аннулирован во время второго хранилищаB=1
может быть сброшено немедленно, так как CPU0 владеет строкой кэша, содержащей его. Я знаю, что процессор x86 уважает заказы магазинов. Означает ли это, чтоB=1
не будет записан в кеш раньшеA=1
?Предположим, что в CPU1 выполняются следующие команды:
while (B = 0);
печать A
Достаточно ли добавить только между while
а также print
Команды в CPU1 без добавления защиты между A=1
а также B=1
в CPU0, чтобы получить 1 всегда распечатывается на x86?
while (B=0);
lfence
print A
1 ответ
В 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. для деталей по упорядочению памяти.