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

Сильно не пинайте, голова болит от всей это неопределенности, могу очень ошибаться в своих рассуждениях.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.