Будь умным!


У вас вопросы?
У нас ответы:) SamZan.net

синхронной операцией SDRM в настоящее время следует понимать строгую привязку временных интервалов отправк.html

Работа добавлена на сайт samzan.net:


Конвейерная организация обработки команд в процессорах

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

Конвейеризация (или конвейерная обработка) в общем случае основана на разделении подлежащей исполнению функции на более мелкие части, называемые ступенями, и выделении для каждой из них отдельного блока аппаратуры. Так, обработку любой машинной команды можно разделить на несколько этапов (несколько ступеней), организовав передачу данных от одного этапа к следующему. При этом конвейерную обработку можно использовать для совмещения этапов выполнения разных команд. Производительность при этом возрастает благодаря тому, что одновременно на различных ступенях конвейера выполняются несколько команд. Конвейерная обработка такого рода широко применяется во всех современных быстродействующих процессорах.

Суперскалярность и внеочередное исполнение команд

Основная черта всех современных процессоров состоит в том, что они способны запускать на исполнение не только ту команду, которую (согласно коду программы) следует исполнить в данный момент времени, но и другие «вблизи» неё. Приведём простой (канонический) пример. Пусть нам следует исполнить следующую последовательность команд:

  1.  A = B + C
  2.  Z = X + Y
  3.  K = A + Z

Легко заметить, что команды (1) и (2) совершенно независимы друг от друга — они не пересекаются ни по исходным данным (переменные B и C в первом случае, X и Y во втором), ни по месту размещения результата (переменная A в первом случае и Z во втором). Стало быть, если на данный момент у нас есть свободные исполняющие блоки в количестве более одного, данные команды можно распределить по ним, и выполнить одновременно, а не последовательно*. Таким образом, если принять время исполнения каждой команды равным N тактов процессора, то в классическом случае исполнение всей последовательности заняло бы N*3 тактов, а в случае с параллельным исполнением — всего N*2 тактов (так как команду (3) нельзя выполнить, не дождавшись результата исполнения двух предыдущих).

* — разумеется, степень параллелизма не бесконечна: команды могут быть выполнены параллельно только в том случае, когда на данный момент времени есть в наличии соответствующее количество свободных от работы блоков (ФУ), причём именно таких, которые «понимают» рассматриваемые команды. Например, ALU физически неспособно исполнить инструкцию для FPU. Обратное также верно.

На самом деле, всё ещё сложнее. Так, если у нас имеется следующая последовательность:

  1.  A = B + C
  2.  K = A + M
  3.  Z = X + Y

То очередь исполнения команд процессором будет изменена! Т.к. команды (1) и (3) независимы друг от друга ни по исходным данным, ни по месту размещения результата, они могут быть выполнены параллельно — и будут выполнены параллельно. А вот команда (2) будет выполнена после них (хронологически третьей) — поскольку для того, чтобы результат вычислений был корректен, необходимо, чтобы перед этим была выполнена команда (1). Именно поэтому обсуждаемый в данном разделе механизм и называется «внеочередным исполнением команд» (Out-of-Order Execution или «OoO»): в тех случаях, когда очерёдность выполнения никак не может сказаться на результате, команды отправляются на исполнение не в указанной в программе последовательности, а в той, которая позволяет достичь максимального быстродействия.

Теперь вам должно стать окончательно понятно, зачем современным CPU такое количество однотипных исполняющих блоков: они обеспечивают возможность параллельного выполнения нескольких одинаковых или близких по типу команд, которые в случае с «классическим» подходом к проектированию процессора пришлось бы выполнять так, как они содержатся в исходном коде, одну за другой.



Рис.  «Исполнительная» часть ядра процессора фирмы AMD Deneb в качестве наглядной
иллюстрации возможностей параллельного выполнения команд

Процессоры, оснащённые механизмом параллельного исполнения нескольких подряд идущих команд, принято называть «суперскалярными». Однако не все суперскалярные процессоры поддерживают внеочередное исполнение. Так, в первом примере нам достаточно «простой суперскалярности» (выполнения двух последовательных команд одновременно) — а вот во втором примере без перестановки команд местами уже не обойтись, если мы хотим получить максимальное быстродействие. Все современные процессоры с архитектурой x86  обладают обоими качествами: являются суперскалярными и поддерживают внеочередное исполнение команд — кроме процессора  Atom, который сделан с простой внутренней структурой, чтобы быть дешёвым и энергоэффективным одновременно. В то же время, были в историипроцессоров с архитектурой  x86 и «простые суперскаляры», OoO не поддерживающие. Например, классическим десктопным x86-суперскаляром без OoO был процессор  Pentium (с или без MMX). Тот же процессор Atom можно с натяжкой считать аналогом процессора Pentium, хотя сильно продвинутым и по структуре, и по скорости.

Справедливости ради стоит заметить, что никаких заслуг в разработке концепций суперскалярности и внеочередного выполнения команд  ни у фирмы Intel, ни у фирмы AMD, ни у какого-либо иного (в том числе из ныне почивших) производителя процесссоров с архитектурой x86. Первый суперскалярный компьютер, поддерживающий внеочередное выполнение команд, был разработан Сеймуром Креем (Seymour Cray) ещё в 60-х годах XX века. Для сравнения: фирма Intel свой первый суперскалярный процессор архитектуры x86 (Pentium) выпустила в 1993 г., первый суперскалярный процессор  с  внеочередным выполнением команд (Pentium Pro) — в 1995 г.;первый суперскалярный процессор  с  внеочередным выполнением команд от фирмы AMD (K5) увидел свет в 1996 г..

7. Багатоядерність. Передумови появи багатоядерності. Структури багатоядерних процесорів. Використання засобів досягнення високої продуктивності в ядрах.

 

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

Кризис жанра

Тот фантастический темп, в котором идет развитие всей микроэлектронной промышленности и IT-отрасли последние годы, был предсказан почти полвека назад, в  1965 году (всего лишь через шесть лет после изобретения интегральной микросхемы) Гордоном Муром и всем хорошо известен как эмпирический закон имени его самого.  Мур предсказал, что число транзисторов в одном кристалле будет удваиваться каждые два года. И вот тут хотелось бы отметить один интересный нюанс. Применительно к «обычным процессорам»  простой рост числа транзисторов напрямую никак не сказывается на его производительности. Куда более значимым параметром выступает частота, на которой эти транзисторы работают. Если  посмотреть на историю развития процессоров с архитектурой x86, то можно увидеть как рост числа транзисторов сказывался на общей производительности, чаще всего косвенным образом.

Подходы к разработке процессоров, впервые примененные в процессоре Intel i386DX, оставались актуальными более 20 лет. И только сейчас они потихоньку сменяются новыми. Вспомним несколько вех:

Увеличение разрядности (32-х разрядность в 386-ом, современная 64-х разрядность). Прирост идет за счет того, что на уровне отдельных команд  можно манипулировать большим объемом данных

Усложнение логики исполнения потока команд, спекулятивное исполнение, появление множества однородных исполнительных устройств. Суть всех этих нововведений позволяет процессору в линейном потоке команд выполнять одновременно несколько идущих друг за другом команд.

Появление наборов новых команд, от MMX до SSE и AVX всех версий. Суть очень похожа на рост разрядности: команды из этих расширений умеют манипулировать данными большой разрядности (корректнее сказать, это операции над массивами данных).

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

Рост объемов кеш-памяти. Обеспечивает снижение числа обращений в медленную внешнюю память.

И наконец многоядерность.

Как видно, направлений для траты транзисторов было очень много, но, к сожалению, не все из них позволяют ускорить уже существующие программы. Когда делается очередная модернизация  системы, есть желание получить результат здесь и сейчас, а не выслушивать от производителя процессора добрые сказки о том, что любимый математический пакет написан неправильно, ибо не использует SSE, не критичен к объему кеша и не понимает прелестей многоядерности. И именно поэтому  новенький восьмиядерный процессор, в котором транзисторов в шесть раз больше, чем в старом, даст прирост при использовании этой программы в каких-то жалких два раза...

Рост эффективности исполнения команд процессорным ядром — это весьма и весьма небыстрый процесс (и 5% прироста на мегагерц при смене поколения — это очень хорошая цифра). Поэтому долгие годы, до наступления кризиса в этой сфере и прихода эры многоядерности, рост производительности шел в основном за счет тактовой частоты. Тут все просто и понятно: заставил процессор, даже без всяких нововведений в области его структуры, работать на более высокой тактовой частоте — получил пропорциональный рост производительности. Причем, заметьте, даже для старых приложений.

Набор команд Streaming SIMD Extensions (SSE), появившись в процессоре Pentium III образца 1999 года, тоже вызывал немало вопросов по поводу своей полезности. Сегодня же без применения SSE и его наследников обойтись почти невозможно. О том, что расти старыми темпами вверх по частоте до бесконечности не получится, в законодателе мод, фирме Intel, задумывались еще в эпоху первого поколения процессоров Pentium. И понятно, что если не получается расти в высоту, то единственный способ роста — в ширину. Примерно в то время появился упомянутый выше набор команд для работы с массивами данных MMX. И именно в те годы в недрах фирмы начали разрабатывать  процессор с принципиально новой структурой — были начаты работы по   семейству процессоров Itanium, которое будет управляться «широкими» инструкциями с так называемым явным параллелизмом (EPIC). Более того, перспективы роста в рамках x86-архитектуры в те годы казались настолько туманными, что на архитектуру Itanium предполагалось пересадить всю индустрию ПК (именно поэтому эти процессоры умели эмулировать x86 набор команд — планировался долгий «переходный период»).

Рост по частоте — это самый простой и заманчивый способ обеспечить прирост производительности процессоров. В конце 90-х инженеры фирмы Intel придумали структуру NetBurst, и тогда некоторым из них показалось, что кто-то Большой надежно схвачен за бороду. Фирма а Intel прогнозировала к 2010 году процессоры с частотой в 10 ГГц в практически каждом отдельно взятом ПК.

Прогноз не сбылся. Структура  NetBurst себя не оправдала.  С одной стороны, рост частоты приводил к чрезмерным потреблению мощности и выделению тепла. С другой — структура процессора для работы на этих частотах требовала введения все большего и большего числа стадий конвейера, что самым прямым образом сказывалось на эффективности работы процессора в пересчете на один мегагерц.

Структура процессоров Core 2ознаменовала собой начало новой эры — эры роста процессоров не в высоту, а в ширину.

Производительность процессора

На уровне интуиции с понятием производительности процессора проблем не возникает. Чем быстрее процессор выполняет программу, тем он более производителен. В качестве примера можно рассмотреть процесс конвертирования аудиофайла в формат MP3. Из двух процессоров более производительным  считается тот, который быстрее выполняет конвертирование. Другой пример — финальный рендеринг сцены, созданной в какой-либо программе по трехмерному моделированию (например, 3ds max или Maya). Чем быстрее процессор справится с задачей рендеринга, тем он более производителен. Таких примеров можно привести достаточно много, но и без того понятно, что производительность процессора связана со скоростью выполнения им программного кода. Собственно, именно таким образом и трактуется производительность процессора (Performance), под которой понимают скорость выполнение им команд программного кода (Instruction Per Second, IPS) или количество команд, выполняемых в единицу времени (за одну секунду). Если попытаться записать данное определение в виде математической формулы, то получится следующее:

Как известно, процессор работает на определенной тактовой частоте, которая является одной из его важнейших технических характеристик. За каждый такт, то есть промежуток времени, обратный тактовой частоте, процессор выполняет определенное количество команд. Поэтому вместо количества команд программы, выполняемых за единицу времени, удобнее рассматривать количество команд программы, выполняемых за один такт процессора (Instruction Per Clock, IPC). IPC зависит и от структуры процессора, и от технологии производства, определяющей минимальные размеры используемых транзисторов и их быстродействие, и от оптимизации программного кода к структуре процессора.

Переписав выражение для производительности процессора в виде произведения количества команд, выполняемых за один такт процессора, на количество тактов процессора за единицу времени (тактовая частота процессора, F), получим:

Как видим, производительность процессора прямо пропорциональна как тактовой частоте, так и количеству команд, выполняемых за один такт. Из этой формулы также следует, что существует два принципиально разных подхода к увеличению производительности процессора. Первый из них заключается в увеличении тактовой частоты, а второй — в увеличении IPC.

На практике, как правило, реализуются оба подхода одновременно, то есть производительность процессора увеличивается за счет как масштабирования тактовой частоты, так и увеличения IPC. Вопрос лишь в том, какой из двух подходов является доминирующим. Кроме того, забегая вперед, отметим, что IPC и максимально возможная тактовая частота процессора взаимосвязаны.

Из истории развития  процессоров фирмы Intel понятно, что до некоторого  времени доминирующим средством увеличения производительности процессора являлось увеличение  тактовой частоты. Производительность процессоров буквально отождествлялась с их тактовой частотой, а структура создавалась именно с расчетом обеспечения ее максимально возможного увеличения. Примером этого может служить структура  NetBurst, положенная в основу процессоров семейства Pentium 4, особенностью которой является супердлинный конвейер, что позволяло наращивать тактовую частоту. Дабы не рассматривать структуру  NetBurst детально, поясним это на ассоциативном примере. Предположим, что необходимо собрать несколько ПК, что может выполнить один человек, затратив определенное время. Однако эту же работу можно поручить нескольким людям, организовав их труд по схеме конвейера, когда каждый из них выполняет определенную операцию на конвейере, а собираемые системные блоки движутся по ленте транспортера от одного сборщика к другому. Понятно, что чем больше человек занято на конвейере (число ступеней конвейера), тем меньший объем работы выполняет каждый из них, а следовательно, тем быстрее сможет двигаться конвейер.

По аналогичной схеме работает и процессор. При этом скорость работы конвейера можно ассоциировать с тактовой частотой процессора, а время, отводимое на совершение операций на каждой ступени конвейера, — с тактом процессора. Остается лишь понять, каким образом реализуется конвейерная обработка команд в процессоре.

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

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

Если вспомнить  ассоциативный пример с конвейерной сборкой ПК, становится понятно, что чем больше ступеней у конвейера, тем меньше работы выполняется на каждой ступени и, следовательно, тем меньше времени требуется для прохождения командой данной ступени. А поскольку каждая ступень выполняется за один такт, длинные конвейеры позволяют повышать тактовую частоту процессора, что невозможно в случае коротких конвейеров. Из этого следует, что длина конвейера тесно связана с максимальной тактовой частотой, на которой может работать процессор. В то же время длина конвейера является одним из параметров, определяющих IPC, — чем больше ступеней в конвейере (при прочих равных условиях), тем меньше команд выполняется процессором на каждом такте. Таким образом, мы приходим к еще одному важному выводу: длина конвейера связана и с тактовой частотой процессора, и с IPC, следовательно, максимальная тактовая частота связана с IPC, причем чем выше IPC, тем ниже максимально возможная тактовая частота и наоборот.

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

Преимущества многоядерной структуры процессора

Один из способов создать энергоэффективный процессор — это переход от одноядерной процессорной структуры к многоядерной. Дело в том, что многоядерные процессоры позволяют повышать производительность именно за счет увеличения IPC, то есть количества команд программы, обрабатываемых за каждый такт работы процессора. В идеале при переходе от одноядерной структуры процессора к двухъядерной можно сохранить тот же уровень производительности, снизив тактовую частоту каждого из ядер почти вдвое.

В реальности, конечно, все несколько сложнее — результат будет зависеть от используемого приложения и его оптимизации к двухъядерному процессору. То есть, чтобы приложение могло одновременно задействовать несколько процессорных ядер, оно должно хорошо распараллеливаться. Если же программа написана таким образом, что подразумевает только последовательное выполнение команд, от многоядерности проку не будет.

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

Имеется многоядерный процессор с количеством ядер равным n. Предположим, что на этом процессоре выполняется программа, включающая N команд, причем S команд этой программы может выполняться только последовательно друг за другом, а P (равное N – S) команд являются программно независимыми друг от друга и могут выполняться одновременно на всех ядрах процессора. Обозначим через (равное S / N) — долю команд, выполняемых последовательно, а через(равное 1 – s) — долю команд, выполняемых параллельно.

 

Рис. 1. Выполнение программы на одноядерном процессоре.

В случае применения одноядерного процессора (рис. 1) время, затрачиваемое на выполнение всей программы, составит:

 

t1 = N / IPS.

 

В случае использования n-ядерного процессора (рис. 2) время, затрачиваемое на выполнение всего программного кода, окажется меньше за счет параллельного выполнения P команд на n ядрах процессора и составит:

 Рис. 2. Выполнение программного кода на многоядерном процессоре

Поскольку приростом производительности в данном случае можно считать сокращение времени выполнения программы при использовании многоядерного процессора по сравнению со временем выполнения той же программы при применении одноядерного процессора, то есть t1 / tn, получим, что прирост производительности составит:

 

Графическая зависимость прироста производительности от числа ядер процессора показана на рис. 3.

 

Рис. 3. Зависимость прироста производительности от числа ядер процессора

Как видно из приведенной формулы, прирост производительности в случае многоядерной структуры процессора в большой степени зависит от оптимизации приложения к многоядерной структуре, то есть от его способности распараллеливаться. К примеру, даже в случае, когда 90% команд программы распараллеливается на несколько исполнительных ядер, использование четырехъядерного процессора позволяет получить только трехкратный прирост производительности в сравнении с одноядерной структурой процессора.

Рассмотренный  пример представляет собой идеальную ситуацию, но в реальности все несколько сложнее, тем не менее основная идея остается неизменной: использование многоядерных процессоров требует внесения кардинальных изменений в программное обеспечение. Нужно отметить, что далеко не все приложения даже сегодня оптимизированы под многоядерную структуру процессоров. К примеру, многие игры пока еще не могут получать ощутимого прироста от многоядерной структуры. В то же время имеется ряд приложений, которые, наоборот, позволяют получить ощутимый прирост производительности от многоядерности. К ним относятся программы финального рендеринга трехмерных сцен, программы для работы с видеомонтажем и обработки звука и многие другие. Отметим, что все новые версии популярных программ оптимизируются под многоядерную структуру процессоров, поскольку за ними будущее.

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

Подводя итог, еще раз подчеркнем, что многоядерная структура процессоров позволяет одновременно решать две глобальные задачи: увеличивать производительность процессоров и одновременно создавать энергоэффективные процессоры.

Конечно, многоядерная структура — это лишь один из рецептов создания высокопроизводительных энергоэффективных процессоров. Для создания действительно энергоэффективного многоядерного процессора необходимо, чтобы каждое его ядро было оптимизировано для многоядерной структуры и к тому же было энергоэффективным.




1. Реферат- Функції управління в галузі екології
2. методические основы советской системы физического воспитания
3. Главная экономическая особенность корпорации состоит в том что она выступает законченной формой обособлен
4. Методические рекомендации по выполнению курсовой работы по дисциплине ldquo;Логистикаrdquo; для студентов специ
5.  Историч сведения об осн
6. Задание для экзаменующегося n вариантов III.html
7. на тему- ldquo;Лицарі середньовіччяrdquo; Навколо лицарів яких одні називають безс
8. Реферат- Консультирование в области управления человеческими ресурсами
9. Лапша домашняя с курицей
10. Тема 6 Понятие о займе и кредите Оглавление 1 Понятие кредита1 2 Договоры займа и кредита3 3 DCF
11. Роль углеводов в жизнедеятельности человека
12. Документы по внешнеэкономической деятельности
13. Лекция 2. Факторы внешнего влияния на ПП Человек ~ существо социальное
14.  К преддошкольному возрасту относится период- А
15. Інформаційно-вимірювальна система тиску газу в газопроводі
16. Тема урока- Богатства недр России Задачи урока- 1Продолжать формирование представлений и знаний у уч
17. тематический учет осуществляемый в масштабах страны органами государственной статистики во главе с государ
18. ки почвы под яре надо ориентирся на те факторы кот в первую очередь определяют высоту урожаяя и его устть п
19. ШУШЕНСКИЙ ФИЛИАЛ МАТЕРИАЛОВЕДЕНИЕ
20. реферат дисертації на здобуття наукового ступеня кандидата медичних наук Київ2001