Transactional Memory уже завтра

Nov 29, 2012 13:31

Я слоупок. Оказывается ещё в феврале Intel выктаил спецификацию т.н. Intel TSX. И вроде как процессоры "haswell", которые поддерживают TSX уже начали штамповать и скоро вывалят на прилавки. У реализации есть несколько ограничений, самые существенные - всё работает с точностью до кешлайна (64byte) и все операции с памятью под одной транзакцией Read more... )

Leave a comment

Comments 6

mrshurik November 29 2012, 21:05:27 UTC
я одно не понимаю с этой transactional memory:
есть 2 потока, каждый пытается в цикле провести транзакцию над одним и тем же объектом. получаем вечный deadlock?
типа, пока один пытался провести уже влез другой, облом. аналогично у второго. или я что-то не понимаю?

Reply

_foreseer November 30 2012, 09:27:49 UTC
Ну я так понимаю облом дожен быть только у второго. Т.е. 2 потока, первый пишет в [A], и у него всё хорошо. Второй пишет в [A] и он обламывается, а первый - нет. Он уже записал и застолбил типа. Иначе смысла в этом немного - lock elision только и всё, а называется transactional memory, хоть и restricted.

Deadlock будет если первый пишет в [A], потом [B], а второй в [B], потом [A]. Тогда да, они могут вечно друг об друга обламываться. Ну а дальше вопрос - может ли правильный порядок записи A, B превратится в неправильный B,A из-за write reorder. Вроде на x86 не должен, поэтому всё вроде как должно быть хорошо.

Reply

mrshurik November 30 2012, 19:19:30 UTC
не, я что-то не понимаю тогда.
как я понял, транзакционная память это когда кеш поддерживает несколько версий данных. и транзакция либо выполняется полностью, либо откатывается к началу.
скажем, есть вектор + счётчик элементов + crc. добавить элемент это одна транзакция, но много действий.
пока 1-й поток выполняет транзакцию, 2-й читает старые данные.
если 2-й запишет что-то до конца транзакции 1-го, то изменения 1-го откатываются назад.

Reply

_foreseer December 1 2012, 16:55:32 UTC
если 2й пишет без транзакции, то да. А если и 1й и 2й пишут внутри транзакции (каждый внутри своей), тогда кто первый записал того и тапки. Если 1й поток сначала записал, то 2й при записи туда же обломается и откатит свою транзакцию. Теперь нам достаточно, чтобы порядок всех записей внутри транзакций был одинаковый и будет serialization или как там это называется. В общем, если порядок записи у всех одинаковый, то хоть какая-то транзакция да закончится успешно в каждой попытке.

Reply


Leave a comment

Up