В чем разница между суперскалярным и векторным процессором?

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

Кроме того, если я правильно понял, в современном процессоре присутствуют как скалярные, так и векторные инструкции, поэтому я полагаю, что эти два не являются взаимоисключающими (скалярные инструкции, такие как mov или add, будут выполняться суперскалярно и, например, скалярное произведение будет вычисляться как вектор - в какой-то особой чёрной магии-образе)?

2 ответа

A superscalar processor is capable of executing multiple instructions within a single program in parallel. It does this by analyzing the instruction stream to determine which instructions do not depend on each other, and having multiple execution units within the processor to do the work simultaneously (eg multiple ALUs). Compiler support is generally not required to optimize code for superscalar processors as the functionality is typically implemented entirely in hardware.1

A vector processor contains instructions specifically designed to operate on whole groups of multiple data values at once (called arrays or vectors). Most modern high-performance processors contain some form of vector processing capability; например; the SSE ADDPS Инструкция, доступная в большинстве процессоров x86, вычисляет сумму двух векторов, каждый из которых содержит четыре значения одинарной точности. Компилятор, разработчик и операционная система обычно требуют использования векторных инструкций, и не каждый процессор, даже в нынешних поколениях, поддерживает самые передовые векторные инструкции (например, процессоры Intel Celeron и Pentium, даже в Kaby Lake, не поддерживают AVX).).

В этом ответе содержится дополнительная техническая информация о том, как современные процессоры достигают высокой производительности.


1 Альтернативный и довольно необычный подход к проектированию состоит в том, чтобы иметь несколько исполнительных блоков, но позволить компилятору определять, какие инструкции выдавать каждому исполнительному блоку для каждого тактового цикла. Это называется очень длинным командным словом и обычно встречается только на специализированных процессорах.

Поскольку никто не придумал ответ, я думаю, что я понял это за это время.

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

Векторный процессор на другой стороне использует векторные инструкции, которые должны работать с несколькими числами одновременно. Для этой цели предназначены специальные, более широкие регистры (например, 128-битный xmm* SSE, в который можно упаковать несколько значений, например, 4 32-битных целых числа; AVX-512 представляет 512-битные регистры, которые являются самыми широкими. мог найти). Векторные операции выполняются специальными модулями процессора, которые предназначены для этой цели. Типичным примером векторного процессора является графический процессор - он выполняет только векторные вычисления.

Суперскаляр - это термин, используемый для обозначения конкретной оптимизации, позволяющей скалярным инструкциям выполняться параллельно на разных "обычных" исполнительных блоках (например, нескольких ALU). Он делит инструкции на несколько "потоков" (я только что придумал этот термин), которые затем выполняются одновременно.

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

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


Заметьте, как я никогда не говорил, что любая из категорий взаимоисключающая Это не так. Векторные блоки будут выполнять векторные инструкции, а процессор попытается найти лучший способ распараллеливания скалярных. Фактически, все современные процессоры поддерживают как векторные инструкции (SSE*, 3DNow!, AVX,...), так и скалярные (x86), которые будут выполняться "суперскалярным" способом.

Другие вопросы по тегам