Как использовать Intel TSX с моделью памяти C ++? - PullRequest
5 голосов
/ 21 апреля 2020

Я думаю, что C ++ еще не покрывает какую-либо память транзакций, но все же TSX может как-то уместиться, используя ", как будто rule", в то, что регулируется моделью памяти C ++.

Итак, что происходит при успешной операции HLE или успешной RTM-транзакции?

Сказать «гонка данных есть, но все в порядке» не очень полезно, так как она не проясняет, что означает «хорошо».

С HLE, вероятно, это можно увидеть как «предыдущая операция происходит перед последующей операцией. Как будто секция все еще охранялась заблокированной блокировкой».

Что такое с RTM? Так как здесь нет даже элидированной блокировки, только (потенциально не атомарные c) операции с памятью, которые могут быть загружены, сохранены как, так и без операции. Что синхронизируется с чем? Что происходит перед чем?

1 Ответ

2 голосов
/ 29 апреля 2020

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

Обзор блокировки оборудования

Аппаратное обеспечение программы порядок операций с блокировкой, даже если обрабатывающий процессор не выполнял внешних операций записи в блокировку. Если обрабатывающий процессор сам считывает значение блокировки в критической секции, это будет выглядеть так, как будто процессор получил блокировку (чтение вернет неопределяемое значение). Такое поведение делает выполнение HLE функционально эквивалентным выполнению без префиксов HLE.

Обзор ограниченной транзакционной памяти

Упорядочение памяти RTM

При успешной фиксации RTM все операции с памятью в области RTM кажутся выполненными атомарно. Успешно зафиксированная область RTM, состоящая из XBEGIN, за которым следует XEND, даже без операций с памятью в области RTM, имеет ту же семантику упорядочения, что и инструкция с префиксом LOCK. Инструкция XBEGIN не имеет семантики ограждения. Однако, если выполнение RTM прекращается, все обновления памяти в пределах области RTM отбрасываются и никогда не становятся видимыми для любого другого логического процессора.

Для завершения ответа:

LOCK Префиксные инструкции отображаются на C ++ std::memory_order::seq_cst. Это охватывает все успешные транзакции RTM (которые являются как бы одной инструкцией с префиксом LOCK). Он также охватывает большинство случаев HLE. В частности:

  • LOCK инструкции с префиксом выполняются так, как будто они выполняются, это подразумевает seq_cst слишком
  • То же самое для XACQUIRE XCHG / XRELEASE XCHG, как если бы оно выполняется, это означает seq_cst тоже
  • Наконец, XRELEASE MOV [mem], op - это как MOV [mem], op, так что это просто release (при обычной реализации модели памяти C ++, где последовательно согласованное хранилище имеет ограничение памяти, не загружается)

(Ссылки на документацию предназначены для компилятора Intel. Однако они документируют поведение аппаратного обеспечения, поэтому информация должна быть применима к другим компиляторам. Единственная переменная, которую может ввести компилятор, - переупорядочение во время компиляции. I однако следует ожидать, что если компилятор реализует intrinsi c, он также реализует надлежащий запрет на переупорядочение, если все еще не уверен, устанавливает барьеры компилятора. А при прямой сборке следует просто соответствующим образом пометить код сборки)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...