Наконец, перейдём к вендорам, предоставляющим продукцию с HTM на борту.
IBM
Компания IBM в настоящее время предоставляет процессоры с поддержкой HTM для двух архитектур процессоров: Power* и System z.
Power
В 2012 году стала доступна поддержка HTM для Power [12]. Рассмотрим её особенности.
- Новые инструкции: tbegin, tend и tabort (пять вариантов с различными предусловиями). Смысл их, думаю, понятен из названий. Кроме того, введены команды для замораживания и возобновления транзакции tsr, обнаружения отложенного конфликта tcheck, освобождения ресурсов HTM для новой транзакции treclaim и явной установки содержимого точки сохранения регистров trechkpt.
- В архитектурном состоянии — регистре MSR (англ. machine state register) — добавлены новые биты для определения двух новых спекулятивных режимов. Регистр TFHAR используется для хранения адреса fallback-процедуры, TFIAR — адрес инструкции, вызвавшей отмену транзакции, TEXASR — для хранения причины отката.
- Поддержка режима замороженной транзакции (англ. suspended transaction), в котором временно приостанавливается спекулятивное исполнение. Это позволяет обрабатывать прерывания, исключения, делать системные вызовы в большинстве случаев без необходимости отменять активную транзакцию.
- Поддержка особого вида rollback-only транзакций для сценариев, в которых поток, не разделяющий данных с другими потоками, должен иметь возможность откатить своё состояние. Для таких транзакций не обеспечивается атомарность и изоляция доступов в память, но при этом они могут быть значительно длиннее обычных.
Сочетание решений, использованных для построения HTM для Power ISA, позволяет использовать TM на всех уровнях ПО, характерных для систем Power: гипервизора, операционной системы и пользовательских приложений, при этом обеспечивая совместимость и интероперабельность с традиционными его частями, не использующими TM.
System z
Вторая архитектура, развиваемая компанией IBM — System z, наследница IBM/360. Поддержка HTM в была заявлена в том же 2012 году [7]. При этом в ней используются несколько иные принципы, чем представленные для Power.
Новые инструкции. Для входа и выхода из спекулятивного режима введены TBEGIN, TEND, для его прерывания — TABORT. Для определения глубины вложенности транзакций добавлена команда ETND. Для оптимизации процесса повторения отменённых транзакций инструкция PPA получила новый код функции TX для внесения случайной задержки, оптимальной для конкретной системы. Из спекулятивного режима возможны прямые записи в память с помощью новой инструкции NTSTG (англ. non-transactional storage).
- Один из операндов инструкции TBEGIN позволяет указать, какие регистры должны входить в точку сохранения, что позволяет не учитывать не изменяющиеся внутри транзакции регистры.
- Все исключительные ситуации ведут к откату транзакции (замораживание транзакций отсутствует), однако для каждого XBEGIN можно определить, будет ли при этом вызываться обработчик прерывания в ОС, или управление сразу перейдёт в fallback-ветку.
- Особый тип ограниченных транзакций (англ. constrained transaction), начинающихся с инструкции TBEGINC, для которых аппаратура гарантирует успешное завершение за конечное число попыток. Существуют ограничения на длину и содержимое таких секций: максимальная длина в 32 инструкции, находящихся в пределе 256 последовательных байт в памяти; ограниченный класс команд (например, без операций над числами с плавающей запятой); запрет на циклы и вызов процедур.
Intel
Начиная с четвёртого поколения Intel® CoreTM (микроархитектура Haswell), в 2013 году была представлена поддержка HTM в процессорах Intel [11], получившая имя Intel® Transactional Synchronization Extensions (TSX) [6]. На самом деле TSX — это два независимых расширения набора инструкций, а именно RTM (англ. restricted transactional memory) и HLE (англ. hardware lock elision). Они используют общую аппаратную инфраструктуру для выполнения транзакций, однако предоставляют различный пользовательский интерфейс и не подразумевают одновременное использование в приложении.
Общие особенности TSX.
При входе в транзакцию нет возможности совершать записи в память в обход кэшей, в отличие от рассмотренных выше реализаций.
Достаточно большой список инструкций, запрещённых внутри транзакции и приводящий к её откаты. Среди них: команды сопроцессора X87, IN/OUT, работа с сегментными регистрами, VMX, GETSEC и т.д.
RTM
Введены четыре новые инструкции: XBEGIN определяет вход в транзакцию, XEND — её окончание, XABORT принудительно отменяет текущую транзакцию, XTEST используется для проверки, находится ли процессор в спекулятивном режиме.
Особенности реализации:
- Гарантируется только best-effort поддержка транзакций; всегда нужна fallback-ветвь.
- При откате транзакции и передаче управления на fallback-ветвь код диагностики передаётся в регистре EAX.
Поддержка RTM уже внесена в код библиотеки Glibc [8], для ядра Linux есть неофициальная поддержка [9].
HLE
Расширение HLE несколько выпадает из общей картины поддержки HTM, так как оно изначально предназначено для адаптации существующих приложений, использующих замки, основанные на атомарных инструкциях, с внесением в них минимальных изменений и при этом с сохранением обратной совместимости для получаемого машинного кода.
Определяются два префикса для инструкций: XACQUIRE и XRELEASE (Фактически это переиспользованные пары префиксов REPE LOCK и REPNE LOCK. ). Первая используется для входа в транзакцию, вторая для выхода из неё.
Все инструкции, которые могли использоваться с префиксом LOCK, теперь могут быть задействованы с новыми префиксами: MOV, INC, DEC, XCHG, CMPXCHG и т.д.
- Отсутствует возможность указать отдельную fallback-ветвь. Она всегда совпадает с транзакционной ветвью, но исполняется в классическом режиме.
- При откате транзакции повторное исполнение XACQUIRE может быть произведено как обычный LOCK.
- Процессоры, не поддерживающие HLE, декодируют новые префиксы как обычный LOCK, всегда исполняя код неспекулятивно.
- Инструкция XTEST также может быть использована для проверки нахождения потока в спекулятивном режиме, как и для RTM.