Spec-Zone.ru › GCC 15

7.13.39 Встроенные функции транзакционной памяти x86

Эти встроенные функции аппаратной транзакционной памяти для x86 позволяют использовать транзакции памяти с RTM (Restricted Transactional Memory — ограниченная транзакционная память). Эта поддержка включается параметром -mrtm. О применении HLE (Hardware Lock Elision — аппаратного исключения блокировок) см. специальные для x86 расширения модели памяти для транзакционной памяти.

Транзакция памяти атомарно фиксирует все изменения памяти, делая их видимыми для других потоков. Если транзакция завершается неудачно, она откатывается, а все побочные эффекты отбрасываются.

Как правило, нет гарантии, что транзакция памяти когда-либо завершится успешно, поэтому всегда необходимо предоставлять подходящий резервный код.

Функция RTM: unsigned _xbegin ()

Начинает транзакцию RTM (Restricted Transactional Memory — ограниченная транзакционная память). Возвращает _XBEGIN_STARTED, если транзакция успешно началась (обратите внимание: это не 0, поэтому константу необходимо проверять явно).

Если транзакция прерывается, все побочные эффекты отменяются, а возвращается код прерывания, закодированный в виде битовой маски. Определены следующие макросы:

Макрос: _XABORT_EXPLICIT

Транзакция была явно прервана с помощью _xabort. Параметр, переданный в _xabort, доступен через _XABORT_CODE(status).

Макрос: _XABORT_RETRY

Повторная попытка выполнить транзакцию возможна.

Макрос: _XABORT_CONFLICT

Транзакция прервана из-за конфликта памяти с другим потоком.

Макрос: _XABORT_CAPACITY

Транзакция прервана, поскольку использует слишком много памяти.

Макрос: _XABORT_DEBUG

Транзакция прервана из-за отладочного исключения.

Макрос: _XABORT_NESTED

Транзакция прервана во внутренней вложенной транзакции.

Нет гарантии, что какая-либо транзакция когда-либо завершится успешно, поэтому всегда должен быть предусмотрен допустимый резервный путь.

Функция RTM: void _xend ()

Фиксирует текущую транзакцию. Если активной транзакции нет, возникает ошибка. Все побочные эффекты транзакции в памяти становятся видимыми для других потоков атомарным образом.

Функция RTM: int _xtest ()

Возвращает ненулевое значение, если транзакция в данный момент активна, и 0 в противном случае.

Функция RTM: void _xabort (status)

Прерывает текущую транзакцию. Если активной транзакции нет, ничего не происходит. Значение status — это 8-битная константа; оно закодировано в возвращаемом значении _xbegin.

Ниже приведён пример обработки _XABORT_RETRY и резервного пути для других сбоев:

#include <immintrin.h>

int n_tries, max_tries;
unsigned status = _XABORT_EXPLICIT;
...

for (n_tries = 0; n_tries < max_tries; n_tries++) 
  {
    status = _xbegin ();
    if (status == _XBEGIN_STARTED || !(status & _XABORT_RETRY))
      break;
  }
if (status == _XBEGIN_STARTED) 
  {
    ... transaction code...
    _xend ();
  } 
else 
  {
    ... non-transactional fallback path...
  }

Обратите внимание: в большинстве случаев транзакционный и нетранзакционный код должны синхронизироваться друг с другом, чтобы обеспечить согласованность.

© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-15.3.0/gcc/x86-transactional-memory-intrinsics.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API