Это то, что я думаю , произойдет:
Если два ядра попытались получить доступ к одному и тому же адресу в ОЗУ, одному пришлось бы ждать, пока другое получит доступ к ОЗУ. Во второй раз, когда каждое ядро будет пытаться получить доступ к одному и тому же адресу, они могут все еще иметь эту кэш-память, чтобы они могли одновременно обращаться к своим соответствующим кэшам .
Если два ядра попытались получить доступ к разным адресам в одной и той же оперативной памяти, одному пришлось бы ждать, пока другое получит доступ к оперативной памяти.
Другими словами, я бы предположил, что для задач программирования, интенсивно использующих ОЗУ, многопроцессорность не сильно поможет, если она не требует считывания одного и того же адреса в ОЗУ несколько раз на ядро.
Итак, могут ли несколько процессоров / ядер одновременно обращаться к одной и той же оперативной памяти, или я правильно говорю?
источник
nop
s в код ассемблераОтветы:
Резюме: обычно одно ядро может насыщать шину памяти, если доступ к памяти - это все, что он делает.
Если вы установите пропускную способность памяти вашей машины, вы сможете увидеть, действительно ли однопоточный процесс может достичь этого, а если нет, то как масштабирование использования эффективной пропускной способности зависит от количества процессоров.
Детали будут зависеть от используемой вами архитектуры. Предполагая что-то вроде современных SMP и SDRAM:
может пойти несколькими путями:
они оба хотят читать одновременно:
если они оба хотят написать:
два ядра на одном чипе будут просто записывать в один и тот же кеш, и это нужно всего лишь один раз сбросить в ОЗУ. Фактически, поскольку память будет считываться и записываться в ОЗУ на каждую строку кэша, записи по разным, но достаточно близким адресам могут быть объединены в одну запись в ОЗУ.
два ядра на разных чипах имеют конфликт, и строка кэша должна быть записана обратно в ОЗУ с помощью chip1, извлечена в кэш чипа 2, модифицирована и затем снова записана (не знаю, можно ли объединить запись / выборку путем отслеживания)
Для однократного доступа задержка CAS означает, что две операции могут потенциально чередоваться, чтобы занимать больше (или, возможно, только немного), чем если бы шина находилась в режиме ожидания.
источник
Существует множество различных архитектур машин, каждая со своим набором функций. Одна категория многопроцессорных машин называется MISD для нескольких данных, состоящих из нескольких команд, и такие машины предназначены для одновременного предоставления одних и тех же данных нескольким процессорам. Связанный класс машин, известный как архитектуры SIMD (Single Instruction Multiple Data), встречается гораздо чаще и одновременно обеспечивает доступ к одной и той же памяти, но память содержит вместо данных инструкции. Как в MIMD, так и в SIMD «доступ» означает доступ на чтение - вы можете представить себе проблему, которая возникнет, если два устройства попытаются выполнить запись в одно и то же место одновременно!
источник
Хотя большинство ответов подходит со стороны модели программного и / или аппаратного обеспечения, самый простой способ - рассмотреть, как работают физические чипы ОЗУ. (Кэш расположен между процессором и памятью и просто использует одну и ту же адресную шину, и его работа полностью прозрачна для процессора.) Микросхемы ОЗУ имеют один единственный адресный декодер, который получает адрес ячейки памяти, поступающей на адресная шина (и аналогично шина данных, входящая или выходящая). Настоящая память встроена в «однопроцессорный подход», то есть один процессор подключен через одну шину к одному чипу памяти. Другими словами, это «узкое место фон Неймана», поскольку каждая отдельная инструкция должна ссылаться на память хотя бы один раз. Из-за этого на одном проводе (или проводах, или шине) одновременно может существовать только один сигнал, таким образом, чип ОЗУ может получать по одному адресу ячейки за раз. Пока вы не сможете убедиться, что два ядра поместят один и тот же адрес в адресную шину, одновременный доступ к шине двумя разными драйверами шины (например, ядрами) физически невозможен. (И, если это то же самое, это избыточно).
Остальное - это так называемое аппаратное ускорение. Шина когерентности, кеш, доступ к SIMD и т. Д. - это всего лишь несколько приятных фасадов перед физической памятью, о которых был задан ваш вопрос. Упомянутые ускорители могут охватывать борьбу исключительно за использование адресной шины, а модели программирования не имеют ничего общего с вашим вопросом. Также обратите внимание, что одновременный доступ также будет против абстракции "личное адресное пространство".
Итак, на ваши вопросы: одновременный прямой доступ к ОЗУ невозможен, ни с одинаковыми, ни с разными адресами. Использование кэша может охватить этот факт и, возможно, в некоторых случаях разрешить одновременный доступ. Это зависит от уровня и структуры кэша, а также от пространственной и временной локализации ваших данных. И да, вы правы: многоядерная обработка без расширенного доступа к ОЗУ мало поможет приложениям, интенсивно использующим ОЗУ.
Для лучшего понимания: просто вспомните, как работает Direct Memory Access. Как процессор, так и устройство DMA могут назначать адрес на шину, поэтому они должны исключать друг друга из одновременного использования шины.
источник
Вы не заботитесь о физической памяти, вы заботитесь больше о виртуальной памяти и адресном пространстве в процессах или нитях (все нити одного и тот же процесс имеет общее адресное пространство) на практике.
Конечно, если вы кодируете ядро многоядерной операционной системы, вы сильно заботитесь о согласованности оперативной памяти и кэша.
Большинство многоядерных процессоров имеют некоторую форму механизма согласованности кэша . Детали зависят от процессора. Поскольку процессор использует кэши ЦП , они иногда ведут себя так, как будто несколько ядер процессора одновременно обращаются к одной и той же области памяти.
Последние стандарты промышленных языков, такие как C11 или C ++ 11, имеют некоторую (многопоточную) модель памяти .
источник
Современные процессоры физически привязаны к своим внешним устройствам памяти для получения максимальной пропускной способности передачи данных. Это связано с требованиями к целостности сигнала (длина трассы, завершение, перекос тактового сигнала и т. Д.), Необходимыми для поддержания высоких скоростей передачи. Например, на многопроцессорной материнской плате каждый ЦП имеет выделенный набор слотов DIMM. Независимо от того, что могут подумать программисты, один ЦП не может просто получить доступ к данным внешней памяти другого ЦП. Программное обеспечение для управления памятью системы, будь то на уровне ядра ОС, гипервизора, ядер плоскости данных или иным образом, обрабатывает передачу данных из памяти между процессорами.
источник