Pentium IV

Информация - Компьютеры, программирование

Другие материалы по предмету Компьютеры, программирование

µрняка. Поэтому сперва попробуем понять, почему понадобилось настолько сильно переделывать (а кое-где и создавать заново) архитектуру Pentium 4 вместо того, чтобы подвергать дальнейшим усовершенствованиям ядро Pentium Pro (а мы уже писали ранее, что фактически именно этот процессор служит родоначальником серии Pentium II/III).

 

Как работают современные процессоры

Для начала -- небольшая, но совершенно необходимая теоретическая часть. Во первых, все современные CPU используют конвейерную (pipelined) архитектуру в различных ее вариантах. Это означает, что любая команда выполняется не одним, а несколькими блоками, объединенными в конвейер. Первым процессором, в котором было применено такое решение, стал Intel 486, он имел конвейер из пяти ступеней.

Однако это еще не все. Дело в том, что внутри любой современный CPU уже давно "наполовину RISC", т. е. фактически он исполняет совсем другие команды, а не те, что поступают к нему из ОЗУ. Эра процессоров, "напрямую" выполнявших команды x86-ассемблера, закончилась еще с приходом Intel Pentium Pro/II и AMD K5/K6. Все последующие CPU сначала осуществляют преобразование довольно "емких" x86-команд в более простой RISC-подобный код (как правило, при этом одна команда преобразуется в несколько), исполнением которого и занимается непосредственно ядро процессора. Такой, на первый взгляд, сложный путь был избран потому, что ядро, исполняющее простые команды, гораздо легче "переносит" высокие частоты работы. В общем, спор между низкочастотным сложным ядром и высокочастотным простым уже давно и однозначно решен в пользу последнего.

При этом появляется еще одна возможность увеличения скорости исполнения команд -- параллелизация обработки. То есть несколько RISC-подобных команд обрабатываются параллельно -- за один такт, но на разных участках конвейера. Ну и кроме того, начиная с Intel Pentium, архитектура современных CPU стала "суперскалярной" (superpipelined), это означает, что конвейеров в них несколько и работают они параллельно.

Конвейерная архитектура: плюсы и минусы, проблемы и решения

Однако на этом пути возникла существенная проблема, связанная уже с недостатком самой конвейерной архитектуры. Поток команд, поступающих на конвейер, очень желательно сделать постоянным и непрерывным. В противном случае из-за "заминки" на любой его стадии те операции, для которых необходимо "знать" результат исполнения предыдущей команды, будут просто ждать ее завершения, и все "замрет". Для устранения этой проблемы используются два приема: внеочередное исполнение (Out-of-Order Execution) и предсказание ветвлений (Branch Prediction).

Внеочередное исполнение -- термин, понимать который следует именно буквально: команды, поступающие на конвейер позже, исполняются -- раньше. Рассмотрим простой пример "программы":

A = B + C
N = A + 2
C = B + 3

В этом случае для выполнения второй операции необходимо завершить первую, так как значение A + 2 невозможно узнать до тех пор, пока в результате предыдущей операции не будет установлено значение A. Однако для выполнения третьей команды результаты двух предшествующих знать не обязательно! Значит, чтобы конвейер не простаивал, следует исполнять сначала первую команду, потом сразу же можно приступать к третьей, а уж пока она будет выполняться, "подоспеет" значение А, необходимое для выполнения второй. Именно выявлением подобных последовательностей и занимаются современные CPU, что позволяет им в результате сократить время простоя.

Механизм предсказания ветвлений -- штука более сложная, однако получить некоторое представление о нем на простейшем примере тоже можно. Правда, необходимо знать хотя бы азы программирования (к примеру, BASIC). Итак, представим себе цикл FOR I = 1 TO 10 ... NEXT I. При компиляции этого цикла в машинный код он преобразуется примерно в такую последовательность команд:

10 I = 1
20 ...
30 I = I + 1
40 IF I <= 10 THEN GOTO 20
50 ...

Как видите, переход со строки 40 в десяти случаях осуществляется на строку 20 и только в одном -- на строку 50. Механизм предсказания при этом просто "запомнит", куда произошел переход по условию в самый первый раз, после чего будет предполагать, что и в следующий раз переход осуществится туда же. И ошибется всего лишь один раз из десяти! А ведь в реальных задачах встречаются циклы с гораздо большим количеством повторений... Зная же, какие команды последуют за операцией перехода, можно, соответственно, начать декодировать их задолго до того, как сама операция совершится. И опять-таки конвейер будет "спасен" от простоя.

Разумеется, все приведенные выше примеры относятся к самым примитивным. На практике алгоритмы, ведающие внеочередным исполнением и предсказанием ветвлений, гораздо сложнее (и, кстати, являются тайной за семью печатями, потому что от них во многом зависит производительность конкретного CPU). Однако для того чтобы понять отличия Pentium 4 от предыдущих процессоров, знать "как это работает" -- просто необходимо.

Pentium 4: гиперконвейеризация

Как мы уже говорили ранее -- чем примитивнее команды, тем на большей частоте способно работать исполняющее их ядро. Однако элементы конвейера также подпадают под это правило: чем проще одна ступень конвейера -- тем с большей скоростью он может "продвигаться". Но простая ступень может выполнять только простое действие, следовательно, количество их должно возрасти. Собственно, здесь мы уже вплотную подошли к ответу на вопрос, почему ядру Coppermine, наследнику "старичка" Pentium Pro