Транзакционная память
В информатике и инженерии , транзакционная память пытается упростить параллельное программирование позволяя группе инструкций загрузки и сохранения выполняться атомарным способом . Это механизм управления параллелизмом , аналогичный транзакциям базы данных , предназначенный для управления доступом к общей памяти при параллельных вычислениях . Системы транзакционной памяти обеспечивают абстракцию высокого уровня в качестве альтернативы синхронизации потоков низкого уровня. Эта абстракция позволяет координировать одновременные операции чтения и записи общих данных в параллельных системах. [1]
Мотивация
[ редактировать ]
В параллельном программировании синхронизация требуется, когда параллельные потоки пытаются получить доступ к общему ресурсу. Конструкции синхронизации потоков низкого уровня, такие как блокировки, являются пессимистичными и запрещают потокам, находящимся за пределами критического раздела , выполнять код, защищенный критическим разделом. Процесс применения и снятия блокировок часто действует как дополнительные накладные расходы в рабочих нагрузках с небольшими конфликтами между потоками. Транзакционная память обеспечивает оптимистичный контроль параллелизма , позволяя потокам работать параллельно с минимальным вмешательством. [2] Целью систем транзакционной памяти является прозрачная поддержка областей кода, помеченных как транзакции, путем обеспечения атомарности , согласованности и изоляции .
Транзакция — это набор операций, которые могут выполнять и фиксировать изменения, пока не возникает конфликта. При обнаружении конфликта транзакция вернется в исходное состояние (до каких-либо изменений) и будет выполняться повторно до тех пор, пока все конфликты не будут устранены. До успешной фиксации результат любой операции внутри транзакции является чисто спекулятивным. В отличие от синхронизации на основе блокировок, при которой операции сериализуются для предотвращения повреждения данных, транзакции допускают дополнительный параллелизм, пока лишь немногие операции пытаются изменить общий ресурс. Поскольку программист не несет ответственности за явную идентификацию блокировок или порядок их получения, программы, использующие транзакционную память, не могут создавать взаимоблокировки . [2]
При наличии этих конструкций транзакционная память обеспечивает абстракцию программирования высокого уровня, позволяя программистам заключать свои методы в транзакционные блоки. Правильные реализации гарантируют, что данные не могут быть разделены между потоками без прохождения транзакции и дают сериализуемый результат. Например, код можно записать так:
def transfer_money(from_account, to_account, amount):
"""Transfer money from one account to another."""
with transaction():
from_account.balance -= amount
to_account.balance += amount
В коде блоку, определенному «транзакцией», гарантируется атомарность, согласованность и изоляция базовой реализацией транзакционной памяти, и он прозрачен для программиста. Переменные внутри транзакции защищены от внешних конфликтов, гарантируя, что либо будет передана правильная сумма, либо вообще не будет предпринято никаких действий. Обратите внимание, что ошибки, связанные с параллелизмом, по-прежнему возможны в программах, использующих большое количество транзакций, особенно в программных реализациях, где библиотека, предоставляемая языком, не может обеспечить правильное использование. Ошибки, возникающие в результате транзакций, часто бывает трудно отладить, поскольку точки останова не могут быть размещены внутри транзакции. [2]
Транзакционная память ограничена тем, что требует абстракции общей памяти. Хотя программы с транзакционной памятью не могут вызвать взаимоблокировку, программы все равно могут страдать от блокировки или нехватки ресурсов . Например, более длинные транзакции могут неоднократно возвращаться в ответ на несколько более мелких транзакций, тратя впустую время и энергию. [2]
Аппаратное обеспечение против программного обеспечения
[ редактировать ]
Абстракция атомарности в транзакционной памяти требует аппаратного механизма для обнаружения конфликтов и отмены любых изменений, внесенных в общие данные. [3] Аппаратные системы транзакционной памяти могут включать модификации процессоров, кэша и протокола шины для поддержки транзакций. [4] [5] [6] [7] [8] Спекулятивные значения в транзакции должны помещаться в буфер и оставаться невидимыми для других потоков до момента фиксации. Большие буферы используются для хранения спекулятивных значений, избегая при этом распространения записи через базовый протокол когерентности кэша . Традиционно буферы реализовывались с использованием различных структур в иерархии памяти, таких как очереди хранения или кэши. Буферы, расположенные дальше от процессора, такие как кэш L2, могут хранить более спекулятивные значения (до нескольких мегабайт). Оптимальный размер буфера все еще обсуждается из-за ограниченного использования транзакций в коммерческих программах. [3] В реализации кэша строки кэша обычно дополняются битами чтения и записи. Когда аппаратный контроллер получает запрос, контроллер использует эти биты для обнаружения конфликта. Если в параллельной транзакции обнаружен конфликт сериализуемости, то спекулятивные значения отбрасываются. При использовании кэшей в системе может возникнуть риск ложных конфликтов из-за использования детализации строк кэша. [3] Условная загрузка/сохранение (LL/SC), предлагаемая многими RISC- процессорами, может рассматриваться как самая базовая поддержка транзакционной памяти; однако LL/SC обычно работает с данными размером с машинное слово, поэтому поддерживаются только однословные транзакции. [4] Хотя аппаратная транзакционная память обеспечивает максимальную производительность по сравнению с программными альтернативами, в настоящее время ее использование ограничено.
Программная транзакционная память обеспечивает семантику транзакционной памяти в библиотеке времени выполнения программного обеспечения или языке программирования. [9] и требует минимальной аппаратной поддержки (обычно операция атомарного сравнения и замены или эквивалентная). Обратной стороной является то, что программные реализации обычно приводят к снижению производительности по сравнению с аппаратными решениями. Аппаратное ускорение может снизить некоторые накладные расходы, связанные с программной транзакционной памятью.
Из-за более ограниченного характера аппаратной транзакционной памяти (в текущих реализациях) использующему ее программному обеспечению может потребоваться довольно обширная настройка, чтобы в полной мере воспользоваться ее преимуществами. Например, распределитель динамической памяти может оказывать существенное влияние на производительность, а заполнение структуры может влиять на производительность (из-за проблем с выравниванием кэша и ложным разделением); в контексте виртуальной машины различные фоновые потоки могут вызывать непредвиденное прерывание транзакций. [10]
История
[ редактировать ]Одной из первых реализаций транзакционной памяти был буфер закрытого хранилища, используемый в Transmeta Crusoe Efficeon и процессорах . Однако это использовалось только для облегчения спекулятивной оптимизации двоичной трансляции, а не для какой-либо формы спекулятивной многопоточности или предоставления ее непосредственно программистам. Azul Systems также внедрила аппаратную транзакционную память для ускорения своих Java -устройств, но это также было скрыто от посторонних. [11]
Компания Sun Microsystems реализовала аппаратную транзакционную память и ограниченную форму спекулятивной многопоточности в своем высокопроизводительном процессоре Rock . Эта реализация доказала, что ее можно использовать для устранения блокировок и более сложных гибридных систем транзакционной памяти, где транзакции обрабатываются с помощью комбинации аппаратного и программного обеспечения. Процессор Rock был отменен в 2009 году, незадолго до его приобретения Oracle ; хотя реальные продукты так и не были выпущены, исследователям был доступен ряд прототипов систем. [11]
В 2009 году AMD предложила Advanced Synchronization Facility (ASF) — набор расширений x86 , которые обеспечивают очень ограниченную форму аппаратной поддержки транзакционной памяти. Целью было предоставить аппаратные примитивы, которые можно было бы использовать для синхронизации более высокого уровня, такие как программная транзакционная память или алгоритмы без блокировки. Однако AMD не сообщила, будет ли ASF использоваться в продуктах, и если да, то в какие сроки. [11]
Совсем недавно, в 2011 году, IBM объявила, что Blue Gene/Q имеет аппаратную поддержку как транзакционной памяти, так и спекулятивной многопоточности. Транзакционная память может быть настроена в двух режимах; первый — это неупорядоченный режим с одной версией, в котором запись из одной транзакции вызывает конфликт с любыми транзакциями, читающими тот же адрес памяти. Второй режим предназначен для спекулятивной многопоточности, обеспечивая упорядоченную многоверсионную транзакционную память. Спекулятивные потоки могут иметь разные версии одного и того же адреса памяти, а аппаратная реализация отслеживает возраст каждого потока. Младшие потоки могут получать доступ к данным из более старых потоков (но не наоборот), а запись по одному и тому же адресу осуществляется в соответствии с порядком потоков. В некоторых случаях зависимости между потоками могут привести к аварийному завершению работы младших версий. [11]
( Intel Расширения транзакционной синхронизации TSX) доступны в некоторых процессорах Skylake . Ранее он был реализован также в процессорах Haswell и Broadwell , но оба раза реализации оказались дефектными, а поддержка TSX была отключена. Спецификация TSX описывает API транзакционной памяти для использования разработчиками программного обеспечения, но не содержит подробностей о технической реализации. [11] Архитектура ARM имеет аналогичное расширение. [12]
Начиная с GCC 4.7 доступна экспериментальная библиотека для транзакционной памяти, использующая гибридную реализацию. Вариант Python PyPy также вводит в язык транзакционную память.
Доступные реализации
[ редактировать ]- Аппаратное обеспечение:
- Расширение транзакционной памяти Arm (TME) [13]
- Процессор Blue Gene/Q от IBM (суперкомпьютер Sequoia) [14]
- IBM zEnterprise EC12 , первый коммерческий сервер, включающий инструкции процессора транзакционной памяти.
- Intel Расширения синхронизации транзакций (TSX), доступные в некоторых процессорах на базе Haswell и более поздних версиях, пока не будут удалены в Comet Lake.
- IBM POWER8 и 9 , удалены в Power10 ( Power ISA v.3.1 ) [15] [16] [17]
- Рок-процессор (отменен Oracle )
- Программное обеспечение:
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ Харрис, Тим; Ларус, Джеймс; Раджвар, Рави (2 июня 2010 г.). «Транзакционная память, 2-е издание». Обобщающие лекции по архитектуре компьютеров . 5 (1): 1–263. дои : 10.2200/S00272ED1V01Y201006CAC011 . ISSN 1935-3235 .
- ^ Jump up to: а б с д «Транзакционная память: история и развитие» . Центр Кукуруку . Проверено 16 ноября 2016 г.
- ^ Jump up to: а б с Солихин, Ян (2016). Основы параллельной многоядерной архитектуры . Беркли, Калифорния: Чепмен и Холл. стр. 287–292. ISBN 978-1-4822-1118-4 .
- ^ Jump up to: а б Херлихи, Морис; Мосс, Дж. Элиот Б. (1993). «Транзакционная память: архитектурная поддержка структур данных без блокировки» (PDF) . Материалы 20-го Международного симпозиума по компьютерной архитектуре (ISCA) . стр. 289–300.
- ^ Стоун, Дж. М.; Стоун, HS; Гейдельбергер, П.; Турек, Дж. (1993). «Множественные резервации и новости Оклахомы». Параллельная и распределенная технология IEEE: системы и приложения . 1 (4): 58–71. дои : 10.1109/88.260295 . S2CID 11017196 .
- ^ Хаммонд, Л; Вонг, В.; Чен, М.; Карлстром, Б.Д.; Дэвис, доктор юридических наук; Герцберг, Б.; Прабху, МК; Хонго Виджая; Козыракис, К.; Олукотун, К. (2004). «Связность и последовательность транзакционной памяти». Материалы 31-го ежегодного Международного симпозиума по компьютерной архитектуре (ISCA) . стр. 102–13. дои : 10.1109/ISCA.2004.1310767 .
- ^ Ананян, CS; Асанович, К.; Кушмаул, Британская Колумбия; Лейзерсон, CE; Ли, С. (2005). «Неограниченная транзакционная память». 11-й Международный симпозиум по архитектуре высокопроизводительных компьютеров . стр. 316–327. дои : 10.1109/HPCA.2005.41 . ISBN 0-7695-2275-0 .
- ^ «LogTM: транзакционная память на основе журналов» (PDF) . ВИСК.
- ^ «Язык транзакционного программирования ATOMOΣ» (PDF) . Стэнфорд. Архивировано из оригинала (PDF) 21 мая 2008 г. Проверено 15 июня 2009 г.
- ^ Одайра, Р.; Кастанос, Дж.Г.; Накаике, Т. (2013). «Различно ли масштабируются программы C и Java в аппаратной транзакционной памяти?». Международный симпозиум IEEE по характеристикам рабочей нагрузки (IISWC) , 2013 г. п. 34. дои : 10.1109/IISWC.2013.6704668 . ISBN 978-1-4799-0555-3 .
- ^ Jump up to: а б с д и Дэвид Кантер (21 августа 2012 г.). «Анализ транзакционной памяти Хасуэлла» . Реальные мировые технологии . Проверено 19 ноября 2013 г.
- ^ «Arm выпускает SVE2 и TME для архитектуры A-профиля — Блог процессоров — Процессоры — Сообщество Arm» . сообщество.arm.com . 18 апреля 2019 года . Проверено 25 мая 2019 г.
- ^ «Внутренние функции расширения транзакционной памяти (TME)» . Проверено 5 мая 2020 г.
- ^ «IBM помещает транзакционную память в ЦП» . ЭЭ Таймс.
- ^ Брайан Холл; Райан Арнольд; Питер Бергнер; Вайнер душ Сантос Мошетта; Роберт Эненкель; Пэт Хауген; Майкл Р. Мейснер; Алекс Мерикас; Филипп Олер; Берни Шифер; Брайан Ф. Вил; Суреш Уорриер; Дэниел Забава; Адхемерваль Занелла (2014). Методы оптимизации и настройки производительности процессоров IBM, включая IBM POWER8 (PDF) . Красные книги IBM. стр. 37–40. ISBN 978-0-7384-3972-3 .
- ^ Вэй Ли, встроенные функции аппаратной транзакционной памяти компилятора IBM XL для IBM AIX в системах на базе процессоров IBM POWER8
- ^ «Power ISA версии 3.1» . openpowerfoundation.org. 01.05.2020 . Проверено 10 октября 2020 г.
- ^ Java на 1000 ядер - Сказки о совместном проектировании аппаратного и программного обеспечения на YouTube
- ^ «Control.Monad.STM» . hackage.haskell.org . Проверено 6 февраля 2020 г.
- ^ «Домашняя страница STMX» .
- ^ Вонг, Майкл. «Транзакционные языковые конструкции для C++» (PDF) . Проверено 12 января 2011 г.
- ^ «Краткое руководство по транзакционной памяти GCC» .
- ^ «Параметры диалекта C — использование коллекции компиляторов GNU (GCC)» .
- ^ «Транзакционная память — GCC Wiki» .
- ^ Риго, Армин. «Использование всех этих ядер: транзакционная память в PyPy» . europython.eu . Проверено 7 апреля 2015 г.
- ^ «picotm — портативный интегрированный настраиваемый и открытый менеджер транзакций» .
- ^ «Конкурент::TVar» .
Дальнейшее чтение
[ редактировать ]- Харрис, Тим; Ларус, Джеймс Р.; Раджвар, Рави (декабрь 2010 г.), Транзакционная память, 2-е издание , Обобщающие лекции по компьютерной архитектуре, том. 5, Morgan & Claypool, стр. 1–263, номер документа : 10.2200/S00272ED1V01Y201006CAC011.
- Маккенни, Пол Э.; Майкл, Магед М.; Триплетт, Джош; Уолпол, Джонатан (июль 2010 г.). «Почему на другой стороне трава не может быть зеленее: сравнение блокировки и транзакционной памяти». СИГОПС Опер. Сист. Преподобный . 44 (3). Нью-Йорк, штат Нью-Йорк, США: ACM : 93–101. дои : 10.1145/1842733.1842749 . ISSN 0163-5980 . S2CID 1917393 .
- Дэйв Дайс, Йосси Лев, Марк Мойр, Дэн Нуссбаум и Марек Ольшевски. (2009) «Ранний опыт реализации транзакционной памяти на коммерческом оборудовании». Технический отчет Sun Microsystems (60 стр.) SMLI TR-2009-180. Краткая версия появилась на ASPLOS'09. дои : 10.1145/1508244.1508263
- Эми Ван, Мэтью Годе, Пэн Ву, Хосе Нельсон Амарал, Мартин Омахт, Кристофер Бартон, Рауль Сильвера и Мэджид Майкл. « Оценка аппаратной поддержки Blue Gene/Q для транзакционной памяти. Архивировано 27 июня 2013 г. на Wayback Machine ». В материалах 21-й международной конференции по параллельным архитектурам и методам компиляции, стр. 127–136. АКМ, 2012.
- Якоби К., Слегель Т. и Грейнер Д. (декабрь 2012 г.). « Архитектура и реализация транзакционной памяти для IBM System z. Архивировано 4 марта 2016 г. на Wayback Machine ». В микроархитектуре (MICRO), 45-й ежегодный международный симпозиум IEEE/ACM, 2012 г. (стр. 25–36). IEEE.
- Гарольд В. Кейн, Мэджид М. Майкл, Брэд Фрей, Кэти Мэй, Дерек Уильямс и Хунг Ле. «Надежная архитектурная поддержка транзакционной памяти в силовой архитектуре». В материалах 40-го ежегодного международного симпозиума по компьютерной архитектуре ISCA '13, стр. 225–236, ACM, 2013. дои : 10.1145/2485922.2485942
Внешние ссылки
[ редактировать ]- Майкл Нойлинг (IBM), « Что случилось с аппаратной транзакционной памятью!?! » вступительный доклад на linux.conf.au 2014 г.
- Транзакционная память онлайн : Библиография по категориям о транзакционной памяти