Могут ли несколько процессоров / ядер получать доступ к одной и той же оперативной памяти одновременно?

15

Это то, что я думаю , произойдет:

  1. Если два ядра попытались получить доступ к одному и тому же адресу в ОЗУ, одному пришлось бы ждать, пока другое получит доступ к ОЗУ. Во второй раз, когда каждое ядро ​​будет пытаться получить доступ к одному и тому же адресу, они могут все еще иметь эту кэш-память, чтобы они могли одновременно обращаться к своим соответствующим кэшам .

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

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

Итак, могут ли несколько процессоров / ядер одновременно обращаться к одной и той же оперативной памяти, или я правильно говорю?

Потерянный хоббит
источник
Я не могу говорить об аппаратном уровне, на который вы ссылаетесь, но я могу сказать, что многопользовательским задачам с оперативной памятью может помочь многопроцессорная обработка, просто разделив использование; то есть, если у вас есть 500 МБ данных в оперативной памяти, которые необходимо обработать, выделите 250 МБ этих данных / оперативной памяти одному процессу и 250 МБ другому, и вы фактически удвоите свою возможную пропускную способность (ограничения пропускной способности оперативной памяти не выдерживают). Независимо от того, может ли это сделать аппаратное обеспечение, наличие нескольких процессоров, обращающихся к одному и тому же адресу оперативной памяти, является поистине плохой идеей, и большинство многопроцессорных кодов старательно пытаются этого избежать.
Джимми Хоффа
1
@JimmyHoffa Но ограничения пропускной способности ОЗУ - именно то, о чем он говорит (поскольку предполагается, что задача связана с памятью).
@ Джимми Я не вижу проблем с двумя процессорами, пытающимися читать с одного и того же адреса ОЗУ. Я бы только увидел проблему, если бы они пытались писать в нее одновременно.
Потерянный Хоббит
1
на конкретном многоядерном процессоре, с которым я работал, ядра не «знали» ничего кроме своих локальных кешей; все, что нужно было синхронизировать с общим кешем, делалось прозрачно для них за указанное количество тактов процессора; программист, готовый принять это во внимание, просто вручную добавил необходимое количество nops в код ассемблера
gnat
2
Краткий ответ: зависит от архитектуры вашей системной шины, протокола согласованности кэша, количества портов в контроллере DDR и количества контроллеров DDR. Длинный ответ находится в спецификации вашей системы.
SK-logic

Ответы:

11

Резюме: обычно одно ядро ​​может насыщать шину памяти, если доступ к памяти - это все, что он делает.

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


Детали будут зависеть от используемой вами архитектуры. Предполагая что-то вроде современных SMP и SDRAM:

  1. Если два ядра пытались получить доступ к одному и тому же адресу в оперативной памяти ...

    может пойти несколькими путями:

    • они оба хотят читать одновременно:

      • два ядра на одном чипе, вероятно, будут совместно использовать промежуточный кэш на некотором уровне (2 или 3), поэтому чтение будет выполняться только один раз. В современной архитектуре каждое ядро ​​может поддерживать выполнение операций ввода-вывода из одного или нескольких конвейеров до тех пор, пока строка кэша не будет готова.
      • два ядра на разных чипах могут не совместно использовать кэш, но все равно необходимо координировать доступ к шине: в идеале, какой бы чип ни выдавал чтение, он просто отслеживает ответ
    • если они оба хотят написать:

      • два ядра на одном чипе будут просто записывать в один и тот же кеш, и это нужно всего лишь один раз сбросить в ОЗУ. Фактически, поскольку память будет считываться и записываться в ОЗУ на каждую строку кэша, записи по разным, но достаточно близким адресам могут быть объединены в одну запись в ОЗУ.

      • два ядра на разных чипах имеют конфликт, и строка кэша должна быть записана обратно в ОЗУ с помощью chip1, извлечена в кэш чипа 2, модифицирована и затем снова записана (не знаю, можно ли объединить запись / выборку путем отслеживания)

  2. Если два ядра пытались получить доступ к разным адресам ...

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

Бесполезный
источник
Другой элемент списка - это когда одно ядро ​​инициирует передачу DMA, а другое ядро ​​дотрагивается до целевой области.
ot--
7

Итак, могут ли несколько процессоров / ядер одновременно обращаться к одной и той же оперативной памяти, или я правильно говорю?

Существует множество различных архитектур машин, каждая со своим набором функций. Одна категория многопроцессорных машин называется MISD для нескольких данных, состоящих из нескольких команд, и такие машины предназначены для одновременного предоставления одних и тех же данных нескольким процессорам. Связанный класс машин, известный как архитектуры SIMD (Single Instruction Multiple Data), встречается гораздо чаще и одновременно обеспечивает доступ к одной и той же памяти, но память содержит вместо данных инструкции. Как в MIMD, так и в SIMD «доступ» означает доступ на чтение - вы можете представить себе проблему, которая возникнет, если два устройства попытаются выполнить запись в одно и то же место одновременно!

Калеб
источник
3

Хотя большинство ответов подходит со стороны модели программного и / или аппаратного обеспечения, самый простой способ - рассмотреть, как работают физические чипы ОЗУ. (Кэш расположен между процессором и памятью и просто использует одну и ту же адресную шину, и его работа полностью прозрачна для процессора.) Микросхемы ОЗУ имеют один единственный адресный декодер, который получает адрес ячейки памяти, поступающей на адресная шина (и аналогично шина данных, входящая или выходящая). Настоящая память встроена в «однопроцессорный подход», то есть один процессор подключен через одну шину к одному чипу памяти. Другими словами, это «узкое место фон Неймана», поскольку каждая отдельная инструкция должна ссылаться на память хотя бы один раз. Из-за этого на одном проводе (или проводах, или шине) одновременно может существовать только один сигнал, таким образом, чип ОЗУ может получать по одному адресу ячейки за раз. Пока вы не сможете убедиться, что два ядра поместят один и тот же адрес в адресную шину, одновременный доступ к шине двумя разными драйверами шины (например, ядрами) физически невозможен. (И, если это то же самое, это избыточно).

Остальное - это так называемое аппаратное ускорение. Шина когерентности, кеш, доступ к SIMD и т. Д. - это всего лишь несколько приятных фасадов перед физической памятью, о которых был задан ваш вопрос. Упомянутые ускорители могут охватывать борьбу исключительно за использование адресной шины, а модели программирования не имеют ничего общего с вашим вопросом. Также обратите внимание, что одновременный доступ также будет против абстракции "личное адресное пространство".

Итак, на ваши вопросы: одновременный прямой доступ к ОЗУ невозможен, ни с одинаковыми, ни с разными адресами. Использование кэша может охватить этот факт и, возможно, в некоторых случаях разрешить одновременный доступ. Это зависит от уровня и структуры кэша, а также от пространственной и временной локализации ваших данных. И да, вы правы: многоядерная обработка без расширенного доступа к ОЗУ мало поможет приложениям, интенсивно использующим ОЗУ.

Для лучшего понимания: просто вспомните, как работает Direct Memory Access. Как процессор, так и устройство DMA могут назначать адрес на шину, поэтому они должны исключать друг друга из одновременного использования шины.

katang
источник
1

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

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

Большинство многоядерных процессоров имеют некоторую форму механизма согласованности кэша . Детали зависят от процессора. Поскольку процессор использует кэши ЦП , они иногда ведут себя так, как будто несколько ядер процессора одновременно обращаются к одной и той же области памяти.

Последние стандарты промышленных языков, такие как C11 или C ++ 11, имеют некоторую (многопоточную) модель памяти .

Василий Старынкевич
источник
0

Современные процессоры физически привязаны к своим внешним устройствам памяти для получения максимальной пропускной способности передачи данных. Это связано с требованиями к целостности сигнала (длина трассы, завершение, перекос тактового сигнала и т. Д.), Необходимыми для поддержания высоких скоростей передачи. Например, на многопроцессорной материнской плате каждый ЦП имеет выделенный набор слотов DIMM. Независимо от того, что могут подумать программисты, один ЦП не может просто получить доступ к данным внешней памяти другого ЦП. Программное обеспечение для управления памятью системы, будь то на уровне ядра ОС, гипервизора, ядер плоскости данных или иным образом, обрабатывает передачу данных из памяти между процессорами.

Джефф Брауэр
источник
1
этот пост довольно трудно читать (стена текста). Не могли бы вы изменить его в лучшую форму?
комнат