Spec-Zone.ru › GCC 11

Next: x86 Защиту потока управления Встроенные функции, Previous: x86 Встроенные функции, Up: Встроенные функции, специфичные для конкретных целевых машин [Содержание][Индекс]

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

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

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

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

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

Начать транзакцию RTM (Ограниченная транзакционная память). Возвращает _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...
  }

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

Next: x86 Защиту потока управления Встроенные функции, Previous: x86 Встроенные функции, Up: Встроенные функции, специфичные для конкретных целевых машин [Содержание][Индекс]

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

Spec-Zone.ru

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