мульти-процессор, многоядерный и гиперпоточный


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

EDIT: вот мое текущее понимание после обучения в интернете и изучения комментариев других; может ли кто-нибудь просмотреть комментарий, пожалуйста?

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

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

3 67

3 ответа:

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

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

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

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

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

  • Hyper-threading отслеживает два контекста сразу в одном ядре, подвергая больше параллелизма неупорядоченному ядру процессора. Это позволяет поддерживать работу исполнительных блоков, даже если один поток застопорился при пропуске кэша, неправильном предсказании ветвей или ожидании результатов от инструкций с высокой задержкой. Это способ получить более полную пропускную способность без репликации большого количества оборудования, но если что-то замедляет каждый поток в отдельности. посмотреть этот Q&A для более подробной информации, и объяснение того, что было не так с предыдущей формулировкой этого пункта.

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

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

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

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

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

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

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

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

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

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

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