Модели параллелизма и памяти - PullRequest
8 голосов
/ 27 августа 2011

Я смотрю это видео Херба Саттера на GPGPU и новую библиотеку C ++ AMP.Он говорит о моделях памяти и упоминает Слабые модели памяти , а затем Сильные модели памяти , и я думаю, что он имеет в виду порядок чтения / записи и т. Д., Но я, однако, не уверен.

Google показывает некоторые интересные результаты (в основном научные статьи) о моделях памяти, но может ли кто-нибудь объяснить, что такое модель слабой памяти и что такое модель сильной памяти и как они связаны с параллелизмом?

Ответы [ 4 ]

13 голосов
/ 01 сентября 2011

С точки зрения параллелизма, модель памяти определяет ограничения на доступ к данным и условия, при которых данные, записанные одним потоком / ядром / процессором, становятся видимыми для другого.

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

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

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

Самая слабая модель памяти не будет накладывать никаких ограничений на порядок, в котором процессоры видят записи друг друга. Разные процессоры в одной и той же системе могут видеть записи в разных порядках, а некоторые процессоры могут использовать «устаревшие» данные из своего собственного кэша в течение длительного времени после записи в тот же адрес памяти другим процессором. Иногда целые строки кэша обрабатываются как единое целое, поэтому запись в одну переменную в строке кэша приведет к тому, что записи из других процессоров в другие переменные в этой строке кэша, которые еще не видны первому процессору, будут эффективно отброшены, так как устаревшие значения записываются поверх, когда он в конечном итоге записывает строку кэша в память. При такой схеме необходимо соблюдать крайнюю осторожность, чтобы гарантировать передачу данных на другие процессоры в правильном порядке, используя явные инструкции синхронизации.

Например, модель памяти Intel x86, как правило, считается более сильной, поскольку существуют строгие правила относительно порядка, в котором записи становятся видимыми для других процессоров, тогда как процессоры DEC Alpha и ARM, как правило, считаются имеющими Модели со слабой памятью, поскольку записи с одного процессора должны быть видимыми для других процессоров только в определенном порядке, если вы явно поместили инструкции по упорядочению (ограждения или барьеры памяти) в свой код.

Некоторые системы имеют память, доступную только определенным процессорам. Поэтому для передачи данных между этими процессорами требуются явные инструкции по передаче данных. Так обстоит дело с процессорами Cell, а часто и с графическими процессорами. Это можно рассматривать как крайность слабой модели памяти - данные видны другим процессорам, только если вы явно активизируете передачу данных.

Языки программирования обычно навязывают свои собственные модели памяти поверх того, что предоставляют базовые процессоры. Например, C ++ 0x задает полный набор ограничений порядка, начиная от полностью ослабленной до полной последовательной согласованности, поэтому вы можете указать в коде то, что вам нужно. С другой стороны, Java имеет очень специфический набор ограничений порядка, которые должны соблюдаться и не могут быть изменены. В обоих случаях компилятор должен преобразовать требуемые ограничения в соответствующие инструкции для базового процессора, что может быть довольно сложно, если вы запрашиваете последовательную согласованность на слабо упорядоченном компьютере.

6 голосов
/ 27 августа 2011

Эти два термина четко не определены, и это не черно-белая вещь.

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

Это в основном относится к гарантиям, предлагаемым для одновременных обращений к памяти.

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

Но в более слабой модели памяти ни один из них не может удержаться.

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

Более слабой гарантией является причинно-следственная последовательность: гарантия того, что события наблюдаются после событий, от которых они зависят.

Другими словами, если сначала записать значение x по какому-либо адресу A, а затем записать второе значение y по тому же адресу, то ни один поток никогда не прочитает значение y после считывания значения x. Поскольку две записи выполняются по одному и тому же адресу, это нарушит причинно-следственную согласованность, если не все потоки будут соблюдать один и тот же порядок. Но это ничего не говорит о том, что должно произойти с несвязанными событиями. Результат записи третьего значения в другой адрес памяти может наблюдаться в абсолютно любое время другими потоками (поэтому разные потоки могут наблюдать события в другом порядке, в отличие от последовательной последовательности)

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

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

Но более слабая модель предоставляет больше возможностей для оптимизации, и, в особенности, она масштабируется лучше с большим количеством ядер (поскольку требуется меньше синхронизации)

Последовательная согласованность в основном бесплатна на одноядерном процессоре, выполнима на четырехъядерном, но будет чрезмерно дорогой в 32-ядерной системе или в системе с 4 физическими процессорами. Или система с общей памятью между несколькими физическими машинами.

Чем больше у вас ядер, и чем дальше они друг от друга, тем сложнее обеспечить, чтобы все они наблюдали события в одном и том же порядке. Таким образом, компромиссы сделаны, и вы соглашаетесь на более слабую модель памяти, которая дает более слабые гарантии.

4 голосов
/ 27 августа 2011

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

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

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

Понимание влияния методов низкого блокировки в многопоточных приложениях

Однако нет точной границы между сильной и слабой моделями памяти, если только вы не рассматриваете последовательно согласованную модель против других. Некоторые из них просто сильнее / слабее и поэтому более открыты для оптимизации путем переупорядочения, чем другие. Например, модель памяти в .NET 2.0 для x86 допускает немного больше оптимизаций, чем версия в .NET 1.1, поэтому ее можно рассматривать как более слабую модель.

2 голосов
/ 11 января 2015

Google показывает некоторые интересные результаты (в основном научные статьи) о моделях памяти, но может ли кто-нибудь объяснить, что такое модель слабой памяти и что такое модель сильной памяти и их отношение к параллелизму?

Сильная модель памяти - это модель, в которой с точки зрения других ядер считывание и запись происходят по мере их появления в программе и, в частности, в том порядке, в котором они появляются в программе. Это называется последовательной последовательностью.

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

Обратите внимание, что Херб Саттер использует «модель сильной памяти» для обозначения модели, в которой атомные свойства не переупорядочены. Это не общепринятое определение.

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