Могут ли нагрузки проскальзывать под операцией получения / могут ли магазины перемещаться выше выпуска в C ++? - PullRequest
0 голосов
/ 01 июля 2018

TL / DR : правда ли, что только 1 (а не 2) из ​​4 переупорядочений допускается для операций приобретения / выпуска? Если так, то почему?

Пока из того, что я понял о семантике приобретения-выпуска, является (в основном)

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

Но об обратном направлении говорят меньше.

Из некоторых источников (блоги Джеффа Прешинга и других, и некоторые руководства по архитектуре, по-видимому, подразумевают, что это) я прочитал, что операции получения / выпуска эквивалентны (атомный op + барьер памяти в данной области памяти) / (барьер памяти + атомная операция) соответственно.

Они описывают 4 вида барьеров памяти и говорят, что, например, В операции получения используется барьер, подобный LoadLoad + LoadStore (и аналогичный для выпуска).

Как я понимаю, эти барьеры (соответственно LoadLoad + LoadStore и StoreStore + LoadStore) позволяют:

  • магазин, который проскользнет под приобретение

  • груз, чтобы плавать выше выпуска

И груз не может проскользнуть под приобретением / магазин не может плавать выше выпуска.

Это вообще правильно? Это правильно для C ++? Отличается ли C ++ от общего значения?

(потому что, например, этот ответ говорит, что нагрузка может проскальзывать под приобретением (насколько я понимаю). У меня также было несколько источников, в которых говорилось, что что-либо может проскользнуть под приобретением (и наоборот) ).)

Если это правильно, то для чего это нужно? Я пытался придумать что-то вроде (для выпуска):

x.store(5, std::memory_order_release);
y.store(true, std::memory_order_relaxed);

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

Это близко к причине? Если да, то может ли кто-нибудь привести убедительные примеры как приобретения, так и выпуска?

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

1 Ответ

0 голосов
/ 01 июля 2018

Барьеры памяти могут быть использованы для реализации семантики получения нагрузки и освобождения магазина, но они предоставляют более строгие, чем требуется, гарантии, как указано в Статья Джеффа Прешинга :

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

Если вы поместите барьер (ы) LoadLoad + LoadStore между загрузкой и последующими операциями с памятью, то все нагрузки до барьера в программном порядке не могут быть переупорядочены после барьера, и все последующие обращения к памяти не могут быть переупорядочены до барьер. Это более строго, чем необходимо для реализации семантики получения для конкретной операции загрузки, потому что барьер упорядочивает все предыдущие нагрузки, а не только конкретную нагрузку, которая должна иметь семантику получения. Так что они не совсем эквивалентны. То же самое касается семантики релиза магазина. Херб Заикание написал комментарий относительно этого:

Да, это ошибка в моей презентации (слов больше, чем фактическая горка). Пример в порядке, но я должен исправить описание "если это было ограждение для освобождения ". В частности:

начиная с 1:10:30, я не правильно сказал, что у забора релиза есть проблема с корректностью, потому что это позволяет магазинам всплывать (это делает нет, как отмечалось, правило содержится в 29.8.2; спасибо!) - что я должен был иметь сказал, что это все еще пессимизация производительности, потому что забор не связан с этим магазином, но мы не знать, какой следующий магазин должен пессимистически относиться ко ВСЕМ последующие обычные магазины до следующей применимой специальной памяти Точка синхронизации работы - она ​​их все время и толкает вниз не нужно

Причина, по которой семантика загрузки-получения и освобождения магазина реализована в терминах барьеров LoadLoad, LoadStore и StoreStore, заключается в том, что ISA предоставляют только такие барьеры. Существуют исследовательские предложения для более гибких или настраиваемых барьеров, которые могут применяться только к конкретным операциям с памятью или диапазону или блоку инструкций, но они еще не пробились ни к одному из ISA.

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