Аналогия: Стирка белья
Представьте себе магазин химической чистки со следующими удобствами: стойка для подвешивания грязной или чистой одежды, стиральная машина и сушилка (каждая из которых может стирать по одной одежде за раз), складной стол и гладильная доска.
Обслуживающий персонал, который выполняет всю стирку и сушку, довольно тупой, поэтому владелец магазина, который принимает заказы на химчистку, проявляет особую осторожность, чтобы выписать каждую инструкцию очень аккуратно и четко.
В обычный день эти инструкции могут быть чем-то вроде:
- возьмите рубашку со стойки
- постирать рубашку
- сухая рубашка
- гладить рубашку
- сложить рубашку
- положить рубашку обратно на стойку
- взять штаны из стойки
- постирать штаны
- просушить штаны
- сложить штаны
- положить штаны обратно на стойку
- взять пальто со стойки
- стирать пальто
- высушить пальто
- гладить пальто
- положить пальто обратно на стойку
Служитель следит за этими инструкциями, стараясь не делать ничего не по порядку. Как вы можете себе представить, для стирки в течение дня требуется много времени, потому что для полной стирки, сушки и складывания каждого белья требуется много времени, и все это нужно делать по одному.
Тем не менее, однажды служитель уходит и нанимается новый, более умный, служащий, который замечает, что большая часть оборудования бездействует в любой момент времени в течение дня. Пока штаны высыхали, ни гладильная доска, ни стиральная машина не использовались. Поэтому он решил лучше использовать свое время. Таким образом, вместо вышеуказанной серии шагов он сделал бы следующее:
- взять рубашку со стойки
- постирай рубашку, возьми штаны со стойки
- сушить рубашку, стирать штаны
- гладить рубашку, сушить штаны
- сложить рубашку, (взять пальто со стойки)
- положить рубашку обратно на стойку, сложить штаны , (постирать пальто)
- положить штаны обратно на стойку , (высушить шерсть)
- (гладить пальто)
- (положить пальто обратно на стойку)
Это конвейерная обработка. Упорядочение несвязанных действий таким образом, что они используют разные компоненты одновременно. Поддерживая одновременно активными как можно больше различных компонентов, вы максимизируете эффективность и ускоряете время выполнения, в этом случае сокращая 16 «циклов» до 9, ускорение более 40%.
Теперь маленький магазин химчистки начал зарабатывать больше денег, потому что они могли работать намного быстрее, поэтому владелец купил дополнительную стиральную машину, сушилку, гладильную доску, складную станцию и даже нанял другого сопровождающего. Теперь все стало еще быстрее, вместо вышеперечисленного у вас есть:
- взять рубашку со стойки, взять брюки со стойки
- постирать рубашку, постирать штаны , (взять пальто со стойки)
- высушить рубашку, высушить штаны , (постирать пальто)
- гладить рубашку, складывать штаны , (сушить пальто)
- сложить рубашку, положить штаны обратно на стойку , (погладить пальто)
- положить рубашку обратно на стойку, (положить пальто обратно на стойку)
Это суперскалярная конструкция. Несколько подкомпонентов, способных выполнять одну и ту же задачу одновременно, но процессор решает, как это сделать. В этом случае это привело к увеличению скорости почти на 50% (за 18 «циклов» новая архитектура могла проходить 3 итерации этой «программы», в то время как предыдущая архитектура могла выполнять только 2).
Старые процессоры, такие как 386 или 486, являются простыми скалярными процессорами, они выполняют одну инструкцию за раз в том порядке, в котором они были получены. Современные потребительские процессоры начиная с PowerPC / Pentium являются конвейерными и суперскалярными. Процессор Core2 способен выполнять тот же код, который был скомпилирован для 486, при этом все еще используя преимущества параллелизма на уровне команд, потому что он содержит собственную внутреннюю логику, которая анализирует машинный код и определяет, как переупорядочить и запустить его (что можно запустить параллельно , что не может и т. д.) В этом суть суперскалярного дизайна и его практичность.
Напротив, векторный параллельный процессор выполняет операции с несколькими частями данных одновременно (вектором). Таким образом, вместо простого добавления x и y векторный процессор добавил бы, скажем, x0, x1, x2 к y0, y1, y2 (в результате z0, z1, z2). Проблема этой конструкции заключается в том, что она тесно связана с определенной степенью параллелизма процессора. Если вы запустите скалярный код на векторном процессоре (предположим, что сможете), вы не увидите преимущества векторного распараллеливания, потому что его нужно явно использовать, аналогично, если вы хотите использовать преимущества более нового векторного процессора с большим количеством параллельных процессоров (например, способный добавлять векторы из 12 чисел вместо 3), вам нужно будет перекомпилировать ваш код. Проекторы векторных процессоров были популярны в самом старшем поколении суперкомпьютеров, потому что их было легко проектировать, и в науке и технике существует большой класс проблем с большим естественным параллелизмом.
Суперскалярные процессоры могут также иметь возможность выполнять умозрительное выполнение. Вместо того, чтобы оставлять блоки обработки бездействующими и ожидать завершения пути к коду перед тем, как разветвить процессор, можно сделать правильное предположение и начать выполнение кода после ветви до того, как предыдущий код завершил обработку. Когда выполнение предыдущего кода достигает точки ветвления, процессор может затем сравнить фактическую ветвь с предположением ветвления и либо продолжить, если предположение было верным (уже намного впереди того, что было бы, просто ожидая), либо он может аннулировать результаты спекулятивного выполнения и запустить код для правильной ветви.