Здравствуйте, subdmitry, Вы писали:
S>Здравствуйте, diamond666, Вы писали:
D>>как нету, только что скачал — все есть Loads May Be Reordered with Earlier Stores to Different Locations, вот даже скиншот с текстом приатачил (там защита, не скопипируешь).
S>Странно, у меня оно выглядит так:
S>http://i39.tinypic.com/33w7jac.png
S>>>А что там, собственно, написано, нельзя ли это в кратце написать?
S>Спасибо, понял. Выходит, этот код прямо по интелловскому мануалу и написан. Типа проверка, кто читал этот мануал и знает.
Покапавшись детально
тут,
тут и
тут, я пришел к выводу что это не out of order execution, а типа назовем "delayed store", у каждого процессора есть свой малюсенький store buffer в который он кладет записанные новые значение переменных, потом он должен скинуть их в свой кеш L1, работает этот store buffer как раз по правилам той Intel'овской доки. Так вот в нашем случае операции выполняются последовательно, но mov [AA],1 записывается не в кеш а в этот буфер, а потом происходит чтение и другая запись, и только потом сброс store buffer, это объясняет почему 0 появляются не в 1 месте, а иногда в нескольких. Т.к. эти store buffer'ы не когерентны между процессорами происходят вот такие "пирожки". Там кстати рассматривается и более сложный случай "intra-processor forwarding".
только встает тогда вопрос почему из spin-lock'ов выходят через обычный mov (входят соответственно через lock bts/xchg), получается значаение в другом процессоре n-ое кол-во тактов остается устаревшим, пока не скинется store buffer 1 процесора, я имею ввиду test-test-and-set алгоритмы.
Сильно не пинайте, голова болит от всей это неопределенности, могу очень ошибаться в своих рассуждениях.