многопроцессорность, многоядерность и гиперпоточность

80

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

РЕДАКТИРОВАТЬ: вот мое текущее понимание после изучения онлайн и изучения комментариев других; может кто-нибудь просмотреть комментарий, пожалуйста?

  1. Я думаю, что Hyper-Thread - самая плохая технология среди них, но дешевая. Его основная идея - дублирование регистров для экономии времени переключения контекста;
  2. Многопроцессорность лучше, чем гиперпоточность, но поскольку разные процессоры находятся на разных микросхемах, связь между разными процессорами имеет большую задержку, чем многоядерность, а использование нескольких микросхем требует больших затрат и большего энергопотребления, чем при многоядерности ;
  3. многоядерный объединяет все ЦП на одном кристалле, поэтому задержка связи между различными ЦП значительно снижена по сравнению с многопроцессорным. Поскольку он использует один чип для размещения всех процессоров, он потребляет меньше энергии и дешевле, чем многопроцессорная система.

заранее спасибо, Джордж

Георгий2
источник
Гиперпоточность ничем не уступает. Это очень полезно, особенно для серверов. Есть убывающая отдача от ILP (загрузка процессора путем перестановки последовательных инструкций). Гиперпоточность - альтернатива усилению параллелизма: несколько аппаратных потоков выполняются без особых накладных расходов.
amit
Как насчет других моих замечаний о многоядерности и многопроцессорности, как вы думаете, мои выводы верны? Ничего плохого?
George2
1
@ George2 - Ваша редакция очень верна. В этом вся идея. :) Лучшее, что вы можете получить на сервере - это, вероятно, многоядерный многоядерный процессор, но для обычного использования многоядерный - лучший вариант!
Богдан Константинеску,
Спасибо, Богдан, с твоим подтверждением я увереннее! :-)
George2
Это ужасное описание гиперпоточности. Главное - отказаться от некоторой производительности в расчете на поток, чтобы получить более высокую общую пропускную способность, имея лишь немного дополнительного оборудования во внешнем интерфейсе вышедшего из строя ядра. См. Этот вопрос и ответ с вопросом о подобном абзаце в принятом ответе (до моего исправления).
Питер Кордес,

Ответы:

86

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

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

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

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

[EDIT] Вы в значительной степени правильно поняли. Всего несколько мелких замечаний:

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

  • Основная проблема с несколькими процессорами заключается в том, что код, выполняющийся на них, в конечном итоге получит доступ к ОЗУ. Есть N процессоров, но только одна шина для доступа к ОЗУ. Таким образом, у вас должно быть какое-то оборудование, которое гарантирует, что а) каждый ЦП получает достаточный объем доступа к ОЗУ, б) доступ к одной и той же части ОЗУ не вызывает проблем и в) что наиболее важно, что ЦП 2 будет уведомлен когда ЦП 1 записывает в некоторый адрес памяти, который ЦП 2 имеет во внутреннем кэше. Если этого не произойдет, ЦП 2 с радостью будет использовать кешированное значение, не обращая внимания на то, что оно устарело.

    Представьте, что у вас есть задачи в списке, и вы хотите распределить их по всем доступным процессорам. Таким образом, CPU 1 выберет первый элемент из списка и обновит указатели. CPU 2 сделает то же самое. Из соображений эффективности оба процессора будут копировать в кэш не только несколько байтов, но и целую «строку кэша» (какой бы она ни была). Предполагается, что когда вы читаете байт X, вы скоро также прочитаете X + 1.

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

    Это то, что действительно делает многопроцессорными. Побочные эффекты этого могут привести к снижению производительности по сравнению с тем, что вы получили бы, если бы весь код выполнялся только на одном процессоре. Решение было многоядерным: вы можете легко добавить столько проводов, сколько вам нужно для синхронизации кешей; вы даже можете копировать данные из одного кеша в другой (обновляя части строки кеша без необходимости сбрасывать и перезагружать его) и т. д. Или логика кеширования может гарантировать, что все процессоры получат одну и ту же строку кеша, когда они обращаются к одной и той же части реальная оперативная память, просто блокируя ЦП 2 на несколько наносекунд, пока ЦП 1 не внесет свои изменения.

[EDIT2] Основная причина, по которой многоядерный процессор проще, чем многопроцессорный, заключается в том, что на материнской плате вы просто не можете проложить все провода между двумя чипами, которые вам понадобятся для обеспечения эффективной синхронизации. Кроме того, сигнал распространяется только на 30 см / нс (скорость света; в проводе обычно намного меньше). И не забывайте, что на многослойной плате сигналы начинают влиять друг на друга (перекрестные помехи). Нам нравится думать, что 0 - это 0 В, а 1 - 5 В, но на самом деле «0» - это что-то между -0,5 В (перегрузка при падении линии с 1-> 0) и 0,5 В, а «1» - это что-то выше 0,8 В.

Если у вас все внутри одного чипа, сигналы работают намного быстрее, и вы можете иметь их сколько угодно (ну, почти :). Кроме того, намного легче контролировать перекрестные помехи.

Аарон Дигулла
источник
3
Ваше представление о гиперпоточности может немного ввести в заблуждение, поскольку гиперпоточность «просто» имитирует параллельное выполнение нескольких потоков, но в основном пытается улучшить многопоточную производительность с помощью встроенной логики процессора.
JC Inacio,
@jcinacio, улучшает ли многопоточность многопоточность? Почему?
George2
@Aaron, 1. Я отредактировал свои текущие моменты в моем исходном посте, узнав от вас. Не могли бы вы помочь с обзором и комментариями? 2. Что означает «предоставить некоторые из своих внутренних данных другому процессору, чтобы они не мешали». в вашем посте?
George2
@Aaron, ваш ответ такой отличный, мой последний вопрос, почему вы говорите, что многоядерный процессор решает проблему синхронизации статуса процессора / ожидания проблем с ОЗУ? Я думаю, что если логика кода одинакова, проблема с синхронизацией и ожиданием RAM все еще существует. Любые комментарии?
George2
1
@AmitP, обратите внимание, что слишком общие вопросы, как правило, отклоняются и закрываются в Programmers, см. Что происходит на Programmers.SE? Руководство по Stack Overflow
gnat
4

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

Надеюсь, вы найдете здесь всю необходимую информацию.

Богдан Константинеску
источник
Богдан, я отредактировал свои текущие моменты в своем исходном посте. Не могли бы вы помочь с обзором и комментариями? Я узнал их после прочтения ваших рекомендуемых ссылок.
George2,
@ George2 - Ваша редакция очень верна. В этом вся идея. :) Лучшее, что вы можете получить на сервере, это, вероятно, многоядерный многоядерный процессор
Богдан Константинеску
2
Обе ссылки битые :(
rkachach
2

В двух словах: многопроцессорная или многопроцессорная система имеет несколько процессоров. Многоядерная система - это многопроцессорная система с несколькими процессорами на одном кристалле. В гиперпоточности несколько потоков могут выполняться на одном процессоре (то есть время переключения контекста между этими несколькими потоками очень мало).

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

Статьи в Википедии по этим темам весьма наглядны.

амит
источник
Амит, 1. Я отредактировал свои текущие моменты в моем исходном сообщении после того, как узнал от вас. Не могли бы вы помочь с обзором и комментариями? 2. Что значит умереть и рвать в вашем посте?
George2,