Здравствуйте, subdmitry, Вы писали:
S>Здравствуйте, diamond666, Вы писали:
D>>Так вот в нашем случае операции выполняются последовательно, но mov [AA],1 записывается не в кеш а в этот буфер, а потом происходит чтение и другая запись, и только потом сброс store buffer, это объясняет почему 0 появляются не в 1 месте, а иногда в нескольких. Т.к. эти store buffer'ы не когерентны между процессорами происходят вот такие "пирожки". Там кстати рассматривается и более сложный случай "intra-processor forwarding".
S>Интересно. И на сколько тактов получается задержка сброса данных, где-нибудь написано?
А хз, нигде ничего вменяемого нет, только упоминания в разных блогах и в доках AMD, может там связанно с этим store buffer, может процессор раскидал все на разные execution unit'ы и начал выполнять паралельно, может вообще произвел чтение раньше записи, я уже забил получить точный ответ.
Короче если есть чтение после записи которое каким то образом зависит от этой запси — готовься к проблемам, поэтому во всяких .NET, Java при присовоениях используеют разные симантики обращения, в конечном итого совдятся к memory barier'ам.
В данном конкретном случае если вставить вот такое, Bingo мы никогда не увидим: