Spec-Zone.ru › GCC 8

6.59.23 Функции встроенной транзакционной памяти PowerPC на аппаратном уровне

GCC предоставляет два интерфейса для доступа к инструкциям транзакционной памяти на аппаратном уровне (HTM), доступным на некоторых процессорах семейства PowerPC (например, POWER8). Два интерфейса представлены: низкоуровневый интерфейс, состоящий из функций, встроенных для PowerPC, и высокоуровневый интерфейс, состоящий из встроенных функций, общих для PowerPC и S/390.

6.59.23.1 Функции встроенной транзакционной памяти PowerPC (низкий уровень)

Следующие встроенные функции низкого уровня доступны с -mhtm или -mcpu=CPU, где CPU — ‘power8’ или более поздняя модель. Все они генерируют машинные инструкции, являющиеся частью их имени.

Встроенные функции HTM (за исключением __builtin_tbegin) возвращают полное значение регистра состояния 4-битного условия, установленное связанной аппаратной инструкцией. Заголовочный файл htmintrin.h определяет некоторые макросы, которые можно использовать для расшифровки возвращаемого значения. Встроенная функция __builtin_tbegin возвращает простое значение true или false в зависимости от того, была ли успешно начата транзакция или нет. Аргументы встроенных функций точно соответствуют типу и порядку операндов связанной аппаратной инструкции, за исключением встроенной функции __builtin_tcheck, которая не принимает входных аргументов. Обратитесь к руководству ISA для описания операндов каждой инструкции.

unsigned int __builtin_tbegin (unsigned int)
unsigned int __builtin_tend (unsigned int)

unsigned int __builtin_tabort (unsigned int)
unsigned int __builtin_tabortdc (unsigned int, unsigned int, unsigned int)
unsigned int __builtin_tabortdci (unsigned int, unsigned int, int)
unsigned int __builtin_tabortwc (unsigned int, unsigned int, unsigned int)
unsigned int __builtin_tabortwci (unsigned int, unsigned int, int)

unsigned int __builtin_tcheck (void)
unsigned int __builtin_treclaim (unsigned int)
unsigned int __builtin_trechkpt (void)
unsigned int __builtin_tsr (unsigned int)

В дополнение к вышеперечисленным встроенным функциям HTM, мы добавили встроенные функции для некоторых распространённых расширенных мнемоник инструкций HTM:

unsigned int __builtin_tendall (void)
unsigned int __builtin_tresume (void)
unsigned int __builtin_tsuspend (void)

Обратите внимание, что семантика вышеперечисленных встроенных функций HTM должна имитировать семантику блокировки, используемую для критических секций. Встроенные функции, используемые для создания новой транзакции или перезапуска приостановленной транзакции, должны иметь семантику получения блокировки, в то время как встроенные функции, завершающие или приостанавливающие транзакцию, должны иметь семантику освобождения блокировки. Конкретно, это должно имитировать семантику блокировки, как определено в C++11, например: получение блокировки — это как будто выполняется __atomic_exchange_n(&globallock,1,__ATOMIC_ACQUIRE), возвращающее 0, а освобождение блокировки — это как будто выполняется __atomic_store(&globallock,0,__ATOMIC_RELEASE), где globallock — неявная блокировка, определённая реализацией, используемая для всех транзакций. Аппаратные инструкции HTM, связанные со встроенными функциями, изначально обеспечивают необходимые аппаратные барьеры для получения и освобождения блокировки. Однако компилятор также должен быть запрещён от перемещения загрузок и сохранений через встроенные функции таким образом, чтобы нарушать их семантику. Это было достигнуто путём добавления барьеров памяти к связанным инструкциям HTM (что является консервативным подходом для обеспечения семантики получения и освобождения блокировки). Более ранние версии компилятора не рассматривали инструкции HTM как барьеры памяти. Был добавлен макрос __TM_FENCE__, который можно использовать для определения того, рассматривает ли текущий компилятор инструкции HTM как барьеры памяти или нет. Это позволяет пользователю явно добавлять барьеры памяти в свой код при использовании более старой версии компилятора.

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

unsigned long __builtin_get_texasr (void)
unsigned long __builtin_get_texasru (void)
unsigned long __builtin_get_tfhar (void)
unsigned long __builtin_get_tfiar (void)

void __builtin_set_texasr (unsigned long);
void __builtin_set_texasru (unsigned long);
void __builtin_set_tfhar (unsigned long);
void __builtin_set_tfiar (unsigned long);

Пример использования этих низкоуровневых встроенных функций может выглядеть так:

#include <htmintrin.h>

int num_retries = 10;

while (1)
  {
    if (__builtin_tbegin (0))
      {
        /* Transaction State Initiated.  */
        if (is_locked (lock))
          __builtin_tabort (0);
        ... transaction code...
        __builtin_tend (0);
        break;
      }
    else
      {
        /* Transaction State Failed.  Use locks if the transaction
           failure is "persistent" or we've tried too many times.  */
        if (num_retries-- <= 0
            || _TEXASRU_FAILURE_PERSISTENT (__builtin_get_texasru ()))
          {
            acquire_lock (lock);
            ... non transactional fallback path...
            release_lock (lock);
            break;
          }
      }
  }

Была добавлена ещё одна встроенная функция, которая возвращает значение поля состояния транзакции 2-бит в регистре состояния машины (MSR), как хранится в CR0.

unsigned long __builtin_ttest (void)

Эту встроенную функцию можно использовать для определения текущего состояния транзакции с помощью следующего примера кода:

#include <htmintrin.h>

unsigned char tx_state = _HTM_STATE (__builtin_ttest ());

if (tx_state == _HTM_TRANSACTIONAL)
  {
    /* Code to use in transactional state.  */
  }
else if (tx_state == _HTM_NONTRANSACTIONAL)
  {
    /* Code to use in non-transactional state.  */
  }
else if (tx_state == _HTM_SUSPENDED)
  {
    /* Code to use in transaction suspended state.  */
  }

6.59.23.2 Высокоуровневые встроенные функции HTM PowerPC

Следующий высокоуровневый интерфейс HTM становится доступным путём включения <htmxlintrin.h> и использованием -mhtm или -mcpu=CPU, где CPU — ‘power8’ или более поздняя модель. Этот интерфейс является общим для PowerPC и S/390, что позволяет пользователям писать одно реализация исходного кода HTM, которая может быть скомпилирована и выполнена на любой из этих систем.

long __TM_simple_begin (void)
long __TM_begin (void* const TM_buff)
long __TM_end (void)
void __TM_abort (void)
void __TM_named_abort (unsigned char const code)
void __TM_resume (void)
void __TM_suspend (void)

long __TM_is_user_abort (void* const TM_buff)
long __TM_is_named_user_abort (void* const TM_buff, unsigned char *code)
long __TM_is_illegal (void* const TM_buff)
long __TM_is_footprint_exceeded (void* const TM_buff)
long __TM_nesting_depth (void* const TM_buff)
long __TM_is_nested_too_deep(void* const TM_buff)
long __TM_is_conflict(void* const TM_buff)
long __TM_is_failure_persistent(void* const TM_buff)
long __TM_failure_address(void* const TM_buff)
long long __TM_failure_code(void* const TM_buff)

Используя этот общий набор встроенных функций HTM, мы можем создать более переносимую версию примера HTM в предыдущем разделе, которая будет работать как на PowerPC, так и на S/390:

#include <htmxlintrin.h>

int num_retries = 10;
TM_buff_type TM_buff;

while (1)
  {
    if (__TM_begin (TM_buff) == _HTM_TBEGIN_STARTED)
      {
        /* Transaction State Initiated.  */
        if (is_locked (lock))
          __TM_abort ();
        ... transaction code...
        __TM_end ();
        break;
      }
    else
      {
        /* Transaction State Failed.  Use locks if the transaction
           failure is "persistent" or we've tried too many times.  */
        if (num_retries-- <= 0
            || __TM_is_failure_persistent (TM_buff))
          {
            acquire_lock (lock);
            ... non transactional fallback path...
            release_lock (lock);
            break;
          }
      }
  }

Далее: Функции атомарных операций с памятью PowerPC, Предыдущее: Встроенные функции PowerPC AltiVec/VSX, Наверх: Встроенные функции целевых платформ [Содержание][Индекс]

© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-8.5.0/gcc/PowerPC-Hardware-Transactional-Memory-Built-in-Functions.html

Spec-Zone.ru

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