Multi-CPU был первый вариант: Вы бы иметь один или несколько плат с одним или несколькими микропроцессорах на них. Основная проблема здесь заключалась в том, что процессоры должны были бы выставить некоторые из своих внутренних данных на другой процессор, чтобы они не мешали им.
Следующий шаг - гиперпоточность. Один чип на материнской плате, но он имел некоторые части дважды внутри, поэтому он мог выполнять две инструкции одновременно.
Текущая разработка - многоядерная. Это в основном оригинальная идея (несколько полных процессоров), но в одном чипе. Преимущество: дизайнеры Chip могут легко помещать дополнительные провода для сигналов синхронизации в чип (вместо того, чтобы маршрутизировать их на штырь, затем поверх переполненной материнской платы и во второй чип).
Суперкомпьютеры сегодня являются многопроцессорными многоядерными: у них много материнских плат с обычно 2-4 процессорами на них, каждый процессор многоядерный, и каждый из них имеет собственную ОЗУ.
[EDIT] У вас это очень хорошо. Только несколько небольших точек:
Гиперпоточность отлеживает двух контекстов сразу в одном ядре, обнажая более параллелизм ядра процессора испорченный. Это приводит к тому, что исполнительные блоки питаются от работы, даже когда один поток застопоривается на пропуске кеша, неверно передает ответ или ожидает результатов от команд с высокой задержкой. Это способ получить более полную пропускную способность, не реплицируя много аппаратного обеспечения, но, если угодно, это замедляет каждый поток по отдельности. See this Q&A for more details и объяснение того, что было не так с предыдущей формулировкой этого пункта.
Основная проблема с многопроцессорным процессором заключается в том, что работающий на них код в конечном итоге будет обращаться к ОЗУ. Есть N процессоров, но только одна шина для доступа к ОЗУ. Таким образом, у вас должно быть какое-то оборудование, которое гарантирует, что: a) каждый процессор получает достаточный объем доступа к ОЗУ, b) тот доступ к той же части ОЗУ не вызывает проблем и c) самое главное, что CPU 2 будет уведомлен когда ЦП 1 записывает на некоторый адрес памяти, который имеет ЦП 2 во внутреннем кеше.Если этого не произойдет, CPU 2 с радостью будет использовать кешированное значение, не обращая внимания на то, что он устарел
Только представьте, что у вас есть задачи в списке, и вы хотите распространить их на все доступные процессоры. Таким образом, CPU 1 будет извлекать первый элемент из списка и обновлять указатели. CPU 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 В.
Если у вас есть все внутри одного чипа, сигналы работают намного быстрее, и вы можете иметь столько, сколько хотите (ну, почти :). Кроме того, перекрестные помехи намного легче контролировать.
Hyperthreading не уступает. Это очень полезно, особенно для серверов. Снижаются доходы от ILP (сохранение процессора занято перестановкой последовательных инструкций). Hyperthreading - альтернатива ускорению параллелизма: несколько аппаратных потоков выполняются без больших накладных расходов. –
Как насчет моих других моментов в отношении многоядерных процессоров и многопроцессорных процессоров, считаете ли вы, что мои баллы верны? Ничего плохого? – George2
@ George2 - Ваше редактирование очень верно. В этом вся идея. :) Лучшее, что вы можете получить на сервере, вероятно, многоядерный многопроцессорный, но для обычного использования многоядерный - лучший снимок! –