Аналогия: стирка одежды
Представьте себе химчистку со следующими удобствами: вешалкой для развешивания грязной или чистой одежды, стиральной и сушильной машинами (каждая из которых может стирать по одной одежде за раз), раскладным столом и гладильной доской.
Служащий, который выполняет всю фактическую стирку и сушку, довольно туп, поэтому владелец магазина, который принимает заказы на химчистку, уделяет особое внимание тщательному и подробному написанию каждой инструкции.
В обычный день эти инструкции могут выглядеть примерно так:
- возьмите рубашку с вешалки
- постирать рубашку
- высушить рубашку
- погладить рубашку
- сложить рубашку
- положить рубашку обратно на вешалку
- взять штаны с вешалки
- постирать штаны
- высушить штаны
- сложить штаны
- положить штаны обратно на вешалку
- взять пальто с вешалки
- постирать пальто
- высушить пальто
- погладить пальто
- положить пальто обратно на вешалку
Дежурный следует этим инструкциям до мелочей, стараясь не делать ничего не по порядку. Как вы можете себе представить, стирка дневной стирки занимает много времени, потому что требуется много времени, чтобы полностью постирать, высушить и сложить каждую вещь, и все это нужно делать по очереди.
Однако однажды помощник увольняется и нанимается новый, более умный помощник, который замечает, что большая часть оборудования простаивает в любое время в течение дня. Пока брюки сушились, ни гладильной доской, ни стиральной машиной не пользовались. Поэтому он решил лучше использовать свое время. Таким образом, вместо описанной выше серии шагов он сделал бы это:
- возьмите рубашку с вешалки
- постирать рубашку, взять штаны с вешалки
- высушить рубашку, постирать штаны
- погладить рубашку, высушить брюки
- сложите рубашку, (взять пальто с вешалки)
- положить рубашку обратно на вешалку, сложить штаны, (выстирать пальто)
- положить штаны обратно на вешалку, (высушить пальто)
- (погладить пальто)
- (положить пальто обратно на вешалку)
Это конвейеризация. Упорядочение несвязанных действий таким образом, чтобы они использовали разные компоненты одновременно. Поддерживая как можно больше различных компонентов активными одновременно, вы максимизируете эффективность и ускоряете время выполнения, в данном случае уменьшая 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), вам нужно будет перекомпилировать свой код. Конструкции векторных процессоров были популярны в самом старшем поколении суперкомпьютеров, потому что их было легко проектировать, а в науке и технике существуют большие классы задач с большим количеством естественного параллелизма.
Суперскалярные процессоры также могут выполнять спекулятивное выполнение. Вместо того, чтобы оставлять процессоры бездействующими и ждать завершения выполнения пути кода перед ветвлением, процессор может сделать наилучшее предположение и начать выполнение кода после ветвления до того, как предыдущий код завершит обработку. Когда выполнение предшествующего кода догоняет точку ветвления, процессор может затем сравнить фактическую ветвь с догадкой ветвления и либо продолжить, если догадка была правильной (уже намного раньше, чем она была бы, просто ожидая), либо он может сделать недействительными результаты спекулятивного выполнения и запустить код для правильной ветки.
person
Wedge
schedule
01.11.2009