Re[10]: «Детская» задачка для программистов
От: diamond666  
Дата: 31.01.09 19:23
Оценка:
Здравствуйте, 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 мы никогда не увидим:

bb[tt]=1;
_asm sfence; // lock bts dummy1,0
test_aa[tt]=aa[tt];

наместо sfence можно вставить любую инструкцию с префиксом lock
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.