- •9.5. Суперскалярная обработка команд
- •9.5.1. Внеочередное завершение команд
- •9.5.2. Завершение выполнения
- •9.5.3. Операция диспетчеризации
- •9.6 Семейство процессоров Intel ia-32
- •9.6.1. Сегментация памяти для семейства процессоров ia-32
- •9.6.3. Процессоры 80386 и 80486
- •9.6.4. Процессор Pentium
- •9.6.6. Процессоры Pentium II и Pentium III
- •9.6.5. Процессор Pentium Pro
- •9.6.7. Процессор Pentium 4
- •9.6.8. Технология Hyper-Threading от Intel Производительности всегда мало
- •Углубляемся в технологию
- •Максимум эффективности от Hyper-Threading
- •9.6.9. Архитектура ia-64
- •Описание ia-64
- •Архитектура е2к
9.6.7. Процессор Pentium 4
Процессор Pentium 4 выпущен в 2000 году и имеет тактовую частоту от 1,3 до 1,5 ГГц. Он поддерживает весь набор команд IA-32, включая команды ММХ и SSE. Расширенный набор команд SSE (SSE2) позволяет обрабатывать по два упакованных 64-разрядных числа с плавающей запятой или по два упакованных 64-разрядных целых числа, хранящихся в 12-разрядных регистрах ХММ. Такие длинные целые числа удобны для шифрования и дешифрирования — операций, выполняемых в приложениях с функциями защиты данных. Повышение тактовой частоты достигается в значительной мере за счет использования длинных конвейеров с короткими ступенями (теперь их количество увеличено вдвое по сравнению с Pentium III, где их было всего 10), а также за счет усовершенствованных структуры и технологий производства схем.
Процессор содержит раздельные кэши первого уровня для команд и данных. Кэш данных имеет объем 8 Кбайт, 4-канальную множественно-ассоциативную структуру и состоит из блоков по 64 байта. Кэш команд предназначен для хранения декодированных сегментов потока команд, которые могут включать одну или несколько ветвей исходной программы. В случае повторения сегментов выполнение программы протекает быстрее, но требуется проверка, действительно ли каждый раз осуществляется переход к одной и той же ветви программы. Эта стратегия называется кэшированием с отслеживанием (trace cache). Декодированные команды представлены как микрооперации. Каждая команда IA-32 способна определять до восьми микроопераций. В кэше с отслеживанием может находиться множество сегментов потока команд, содержащих до 12 тысяч микроопераций.
Интегрированный в микросхему кэш второго уровня объемом 256 Кбайт состоит из 128-байтовых блоков и обладает 8-канальной множественно-ассоциативной структурой. Соединение между кэшами L1 и L2 обеспечивает пересылку данных со скоростью 48 Гбайт/с, тогда как в процессоре Pentium III этот параметр равен 16 Гбайт/с.
Системная шина процессора Pentium 4 тоже гораздо быстрее шины процессора Pentium III. Она имеет ширину 64 разряда и работает на частоте 400 МГц. Скорость пересылки данных по этой шине составляет 3,2 Гбайт/с, а у процессора Pentium III - 1 Гбайт/с.
9.6.8. Технология Hyper-Threading от Intel Производительности всегда мало
Об эффективности всегда много говорят. И не только в корпоративном окружении, в каких-то серьезных проектах, но и в повседневной жизни. Говорят, homo sapiens лишь частично задействуют возможности своего мозга. То же самое относится и к процессорам современных компьютеров.
Взять, к примеру, Pentium 4. Процессор обладает, в общей сложности, семью исполнительными устройствами, два из которых могут работать с удвоенной скоростью – две операции (микрооперации) за такт. Но в любом случае, вы бы не нашли программы, которая смогла бы заполнить инструкциями все эти устройства. Обычные программы обходятся несложными целочисленными вычислениями, да несколькими операциями загрузки и хранения данных, а операции с плавающей точкой остаются в стороне. Другие же программы главным образом загружают работой устройства для операций с плавающей точкой.
Чтобы проиллюстрировать ситуацию, давайте вообразим себе процессор с тремя исполнительными устройствами: арифметико-логическим (целочисленным – ALU), устройством для работы с плавающей точкой (FPU), и устройством загрузки/хранения (для записи и чтения данных из памяти). Кроме того, предположим, что наш процессор может выполнять любую операцию за один такт и может распределять операции по всем трем устройствам одновременно. Давайте представим, что к этому процессору на выполнение отправляется поток из следующих инструкций:
1+1 10+1 Сохранить предыдущий результат
Рисунок 9.6.3 иллюстрирует уровень загруженности исполнительных устройств (белым цветом обозначается незадействованное устройство, ярко-зеленым (серым) – работающее устройство):
ALU |
|
|
|
FPU |
|
|
|
Load/ Store |
|
|
|
|
1 |
2 |
3 |
|
Clock Cycle |
||
Рис. 9.6.4.
Итак, вы видите, что в каждый такт используется только 33% всех исполнительных устройств. В этот раз FPU остается вообще незадействованным. В соответствии с данными Intel, большинство программ для IA-32 x86 используют не более 35% исполнительных устройств процессора Pentium 4.
Представим себе ещё один поток, отправим его на выполнение процессору. На этот раз он будет состоять из операций загрузки данных, сложения и сохранения данных, зеленый (серый) цвет. Они будут выполняться в следующем порядке:
ALU |
|
|
|
FPU |
|
|
|
Load/ Store |
|
|
|
|
1 |
2 |
3 |
|
Clock Cycle |
||
Рис. 9.6.5.
И снова загруженность исполнительных устройств составляет лишь на 33%.
Хорошим выходом из данной ситуации будет параллелизм на уровне инструкций (Instruction Level Parallelism - ILP). В этом случае одновременно выполняются сразу нескольких инструкций, поскольку процессор способен заполнять сразу несколько параллельных исполнительных устройств. К сожалению, большинство x86 программ не приспособлены к ILP в должной степени. Поэтому приходится изыскивать другие способы увеличения производительности. Так, например, если бы в системе использовалось сразу два процессора, то можно было бы одновременно выполнять сразу два потока. Такое решение называется параллелизмом на уровне потоков (thread-level parallelism, TLP). К слову сказать, такое решение достаточно дорогое.
Какие же ещё существуют способы увеличения исполнительной мощи современных процессоров архитектуры x86?
Hyper-Threading
Проблема неполного использования исполнительных устройств связана с несколькими причинами. Вообще говоря, если процессор не может получать данные с желаемой скоростью (это происходит в результате недостаточной пропускной способности системной шины и шины памяти), то исполнительные устройства будут использоваться не так эффективно. Кроме того, существует ещё одна причина – недостаток параллелизма на уровне инструкций в большинстве потоков выполняемых команд.
В настоящее время большинство производителей улучшают скорость работы процессоров путем увеличения тактовой частоты и размеров кэша. Конечно, таким способом можно увеличить производительность, но все же потенциал процессора не будет полностью задействован. Если бы мы могли одновременно выполнять несколько потоков, то мы смогли бы использовать процессор куда более эффективно. Именно в этом и заключается суть технологии Hyper-Threading.
Hyper-Threading – это название технологии, существовавшей и ранее вне x86 мира, технологии одновременной многопоточности (Simultaneous Multi-Threading, SMT). Идея этой технологии проста. Один физический процессор представляется операционной системе как два логических процессора, и операционная система не видит разницы между одним SMT процессором или двумя обычными процессорами. В обоих случаях операционная система направляет потоки как на двухпроцессорную систему. Далее все вопросы решаются на аппаратном уровне.
Hyper-Treading Technology |
|||
Multiprocessor |
|
Hyper-Treading |
|
AS
Processor Execution Resources |
AS
Processor Execution Resources |
|
AS AS
Processor Execution Resources |
|
|||
Рис. 9.6.6. Схема процессора, поддерживающего технологию Hyper-Treading. AS- видимая операционной системой структура исполнительных устройств (Architecture State)
В процессоре с Hyper-Threading каждый логический процессор имеет свой собственный набор регистров (включая и отдельный счетчик команд), а чтобы не усложнять технологию, в ней не реализуется одновременное выполнение инструкций выборки/декодирования в двух потоках. То есть такие инструкции выполняются поочередно. Параллельно же выполняются лишь обычные команды.
