Першою версією була Multi-CPU: у вас була б одна або кілька материнських плат з однією або кількома мікросхемами процесора. Основною проблемою тут було те, що центральним процесорам доведеться виставляти деякі свої внутрішні дані іншому центральному процесору, щоб вони не заважали їм.
Наступним кроком була гіперпоточність. Один чіп на материнській платі, але він мав деякі деталі двічі всередині, щоб він міг виконувати дві інструкції одночасно.
Нинішня розробка є багатоядерною. В основному це оригінальна ідея (кілька повних процесорів), але в одному чіпі. Перевага: дизайнери мікросхем можуть легко вкласти додаткові дроти для сигналів синхронізації в мікросхему (замість того, щоб направляти їх на штифт, а потім через переповнену материнську плату і в другу мікросхему).
Суперкомп’ютери сьогодні є багатоядерними, багатоядерними: у них багато материнських плат, на яких зазвичай 2–4 процесори, кожен процесор багатоядерний і кожен має свою власну оперативну пам’ять.
[РЕДАКТУВАТИ] Ви в значній мірі правильно. Кілька незначних моментів:
Гіперпотокові технології відстежують два контексти одночасно в одному ядрі, виявляючи більший паралелізм непрацюючому ядру процесора. Завдяки цьому модулі виконання працюють, навіть коли один потік затримується при пропуску кешу, неправильному передбаченні гілки або очікуванні результатів з інструкцій із високою затримкою. Це спосіб отримати більшу загальну пропускну здатність, не відтворюючи багато обладнання, але в будь-якому випадку це сповільнює кожен потік окремо. Докладнішу інформацію та пояснення того, що було неправильно з попередньою редакцією цього пункту, див.
Основна проблема багатопроцесорного процесора полягає в тому, що код, що працює на них, з часом отримає доступ до оперативної пам'яті. Є N процесорів, але лише одна шина для доступу до оперативної пам'яті. Отже, ви повинні мати певне обладнання, яке гарантує, що а) кожен процесор отримує достатній обсяг оперативної пам’яті, б) доступ до однієї і тієї ж частини оперативної пам’яті не викликає проблем та в) головне, що CPU 2 буде повідомлено коли CPU 1 пише на якусь адресу пам'яті, яку CPU 2 має у своєму внутрішньому кеші. Якщо цього не трапиться, CPU 2 із задоволенням використовуватиме кешоване значення, не враховуючи того, що воно застаріле
Тільки уявіть, що у вас є завдання у списку, і ви хочете поширити їх на всі доступні процесори. Отже, CPU 1 отримає перший елемент зі списку та оновить покажчики. Процесор 2 зробить те саме. З міркувань ефективності обидва процесора не лише копіюють кілька байтів у кеш-пам’ять, але й цілий «рядок кешу» (яким би він не був). Припущення полягає в тому, що коли ви прочитаєте байт X, ви скоро прочитаєте і X + 1.
Тепер обидва процесори мають у кеші копію пам'яті. Потім CPU 1 отримає наступний елемент зі списку. Без синхронізації кешу він не помітив би, що CPU 2 також змінив список, і він почне працювати з тим самим елементом, що і CPU 2.
Це те, що ефективно робить багатопроцесорний процесор настільки складним. Побічні ефекти цього можуть призвести до продуктивності, яка гірша, ніж ви отримаєте, якби весь код працював лише на одному процесорі. Рішення було багатоядерним: Ви можете легко додати стільки проводів, скільки потрібно для синхронізації кеш-пам’яті; ви навіть можете скопіювати дані з одного кешу в інший (оновлюючи частини рядка кешу, не очищаючи і не перезавантажуючи його) і т. д. Або логіка кешу може переконатися, що всі процесори отримують однаковий рядок кешу, коли вони отримують доступ до однієї частини реальна оперативна пам’ять, просто блокуючи CPU 2 на кілька наносекунд, поки CPU 1 не внесе своїх змін.
[EDIT2] Основна причина, чому багатоядерність простіша за багатопроцесорну, полягає в тому, що на материнській платі ви просто не можете прокласти всі дроти між двома мікросхемами, які вам потрібні для ефективної синхронізації. Плюс сигнал проходить лише вершини 30 см / нс (швидкість світла; у дроті у вас зазвичай набагато менше). І не забувайте, що на багатошаровій материнській платі сигнали починають впливати один на одного (перехресні перешкоди). Нам подобається думати, що 0 - це 0 В, а 1 - 5 В, але насправді "0" - це щось між -0,5 В (перенапруження, якщо відпустити лінію з 1>> 0) і .5 В, а "1" - це все вище 0,8 В.
Якщо у вас все всередині однієї мікросхеми, сигнали працюють набагато швидше, і ви можете мати скільки завгодно (ну майже :). Крім того, перехресні перешкоди сигналу набагато простіше контролювати.