Чи можуть декілька процесорів / ядер одночасно отримувати доступ до однієї оперативної пам’яті?


16

Я думаю, що це станеться:

  1. Якщо два ядра намагалися отримати доступ до однієї і тієї ж адреси в ОЗУ, одному доведеться чекати, коли інший отримає доступ до ОЗУ. Другий раз, коли кожне ядро буде намагатися отримати доступ до такої ж адресу, вони можуть по- , як і раніше є , що RAM в кеш, щоб вони могли отримати доступ до своїх відповідних кеші одночасно .

  2. Якщо два ядра намагалися отримати доступ до різних адрес в одній і тій же оперативній пам’яті, одному доведеться чекати, коли інший отримає доступ до ОЗУ.

Іншими словами, я б міг уявити, що для завдань з інтенсивного програмування оперативної пам’яті багатопроцесорна робота не дуже допоможе, якщо вона не передбачає читання з однієї адреси в ОЗУ кілька разів на ядро.

Отже, чи можуть декілька процесорів / ядер отримати доступ до однієї і тієї ж ОЗУ одночасно, або це те, що я кажу, правильно?


Я не можу розмовляти з апаратним рівнем, на який ви звертаєтесь, але можу сказати, що оперативні задачі, які потребують оперативної пам’яті, можуть допомогти шляхом багатопроцесорної обробки шляхом простого розподілу використання; тобто якщо у вас є 500 Мбайт даних в операційному режимі, вам потрібно обробити, видайте 250 Мб даних / оперативної пам'яті одному процесору і 250 Мб іншому, і ви фактично подвоїли свою можливу пропускну спроможність (обмеження пропускної здатності прокладки не витримуєте). Окрім того, чи може це зробити апаратне забезпечення чи ні, наявність декількох процесорів, що отримують доступ до однієї адреси оперативної пам’яті, є справді поганою ідеєю, і більшість кодів із багатопрофільною програмою старанно намагаються уникнути цього.
Джиммі Хоффа

1
@JimmyHoffa Але обмеження пропускної здатності оперативної пам'яті - це саме те, про що він говорить (як припущення, що завдання пов'язане з пам'яттю).

@Jimmy Я не бачу жодних проблем з двома процесорами, які намагаються читати з однієї адреси RAM. Я б бачив проблему лише в тому випадку, якщо вони намагалися написати це одночасно.
Загублений хобіт

1
у конкретному багатоядерному процесорі, з яким я працював, ядра нічого не знали за їхніми локальними кешами; те, що потрібно синхронізувати із спільним кешем, робилося прозоро до них у визначеній кількості процесорних циклів; програміст, готовий врахувати це, щойно вручну додав необхідну кількість nops у свій код складання
gnat

2
Коротка відповідь: залежить від архітектури системної шини, протоколу узгодженості кешу, кількості портів у вашому контролері DDR та кількості контролерів DDR. Довга відповідь - у таблиці даних вашої системи.
SK-логіка

Відповіді:


11

Підсумок: взагалі можливо, що одне ядро ​​насичує шину пам'яті, якщо доступ до пам'яті - це все.

Якщо ви встановите пропускну здатність пам’яті на вашій машині, ви повинні мати змогу побачити, чи може однопотоковий процес дійсно досягти цього, а якщо ні, то як ефективна пропускна здатність використовує масштаби з кількістю процесорів.


Деталі залежать від архітектури, яку ви використовуєте. Якщо припустити щось подібне до сучасних SMP та SDRAM:

  1. Якщо два ядра намагалися отримати доступ до однієї і тієї ж адреси в оперативній пам'яті ...

    може піти декількома шляхами:

    • вони хочуть одночасно читати:

      • два ядра на одній мікросхемі, ймовірно, поділять проміжний кеш на якомусь рівні (2 або 3), тому зчитування буде виконано лише один раз. У сучасній архітектурі кожне ядро ​​може бути в змозі тримати виконання µ-ops з одного або декількох конвеєрів, поки лінія кешу не буде готова
      • два ядра на різних мікросхемах можуть не поділяти кеш-пам'ять, але все-таки потрібно координувати доступ до шини: в ідеалі, який би чіп не видав читання, просто пролунає відповідь
    • якщо вони хочуть написати:

      • два ядра на одній мікросхемі просто записуватимуться в той самий кеш, і їх потрібно лише один раз передати в оперативну пам’ять. Насправді, оскільки пам'ять буде зчитуватися і записуватися в оперативну пам’ять у кеш-рядку, записи за різними, але достатньо близькими адресами можна об'єднати в одне записування в оперативну пам'ять

      • два ядра на різних мікросхемах мають конфлікт, і рядок кешу потрібно буде записати в оперативну пам’ять за допомогою chip1, занести в кеш чіпа2, змінити і знову записати назад (не маю уявлення, чи можна зв'язати запис / витяг за допомогою проносу)

  2. Якщо два ядра намагалися отримати доступ до різних адрес ...

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


Інший елемент списку - це коли одне ядро ​​ініціює передачу DMA, тоді як інше ядро ​​тикає на цільову область.
ott--

7

Отже, чи можуть декілька процесорів / ядер отримати доступ до однієї і тієї ж ОЗУ одночасно, або це те, що я кажу, правильно?

Існує багато різних архітектур машин, кожна зі своїм набором функцій. Одна категорія багатопроцесорних машин називається MISD , призначена для отримання декількох інструкцій з єдиними даними, і такі машини призначені для надання одних і тих же даних декільком процесорам одночасно. Суміжний клас машин, відомий як архітектури SIMD (Single Instruction Multiple Data), набагато частіше зустрічається, а також забезпечує доступ до тієї самої пам'яті одночасно, але пам'ять містить інструкції замість даних. І в MIMD, і в SIMD "доступ" означає доступ для читання - ви можете уявити собі проблему, якби два одиниці намагалися записати в одне і те ж місце розташування одночасно!


3

Хоча більшість відповідей підходять з боку програмної та / або апаратної моделі, найчистішим способом є врахування того, як працюють фізичні чіпи оперативної пам'яті. (Кеш розташований між процесором і пам'яттю, і він просто використовує ту саму шину адреси, і його робота повністю прозора для процесора.) Мікросхеми оперативної пам'яті мають один декодер єдиного адреси, який отримує адресу комірки пам'яті, що надходить на адресна шина (і аналогічно шина даних, вхідна або вихідна). Сучасні пам'яті побудовані в рамках "єдиного процесорного підходу", тобто один процесор підключений через одну шину до однієї мікросхеми пам'яті. Іншими словами, це "вузьке місце фон Неймана", оскільки кожна окрема інструкція повинна хоча б раз посилатися на пам'ять. Через це на одному проводі (або провідниках, також шині) одночасно може існувати лише один сигнал, тому чіп оперативної пам’яті може одночасно отримувати одну адресу комірки. Поки ви не зможете запевнити, що два ядра ставлять одну і ту ж адресу в адресну шину, одночасний доступ до шини двома різними драйверами шин (наприклад, ядрами) фізично неможливий. (І якщо воно те саме, то це зайве).

Решта - так зване апаратне прискорення. Шина узгодженості, кеш-пам'ять, доступ до SIMD тощо - це лише деякі приємні фасади перед фізичною оперативною пам’яттю. Згадані прискорювачі можуть охоплювати боротьбу за використання виключно шини адреси, а моделі програмування не мають великого відношення до вашого питання. Також зауважте, що одночасний доступ також буде проти абстракції "приватного адресного простору".

Отже, до ваших питань: одночасний прямий доступ до оперативної пам’яті неможливий ні з однаковою, ні з різною адресою. Використання кеша може охопити цей факт і може дати можливість очевидного одночасного доступу в деяких випадках. Це залежить від рівня кешу та конструкції, а також просторової та часової локальності ваших даних. І так, ви маєте рацію: багатоядерна обробка без розширеного доступу до оперативної пам’яті не дуже допоможе для інтенсивних програм.

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


1

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

Звичайно, якщо ви кодуєте багатоядерне ядро ​​операційної системи, вам важливо багато оперативної пам'яті та кеш-когерентності.

Більшість багатоядерних процесорів мають певну форму механізму узгодженості кешу . Деталі залежать від процесора. Оскільки процесор використовує кеші процесора , вони іноді поводяться так, ніби кілька ядер процесора одночасно отримують доступ до одного і того ж місця пам'яті.

Останні стандарти промислових мов, такі як C11 або C ++ 11, мають деяку модель пам'яті (у багатьох потоках) .


0

Сучасні процесори фізично пов'язані зі своїми зовнішніми пристроями пам'яті, щоб отримати максимальну пропускну здатність передачі даних. Це пояснюється вимогами цілісності сигналу (довжина сліду, закінчення, перекос годинника тощо), необхідними для підтримки високих швидкостей передачі. Наприклад, на материнській платі з декількома процесорами кожен процесор має спеціальний набір слотів DIMM. Незалежно від того, що думають програмісти, один процесор не може просто отримати доступ до даних зовнішньої пам'яті іншого процесора. Програмне забезпечення управління пам’яттю системи на рівні ядра ОС, Hypervisor, ядер площини даних чи іншим чином обробляє передачу даних між процесором.


1
цю публікацію досить важко читати (стіна тексту). Ви б не хотіли відредагувати його в кращій формі?
гнат
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.