Путешествие через вычислительный конвейер процессора

Путешествие через вычислительный конвейер процессора

Так как карьера программиста тесно связана с процессором, хорошо бы знать как он трудится.Что происходит в процессора? какое количество времени уходит на выполнение одной инструкции? Что означает, в то время, когда новый процессор имеет 12, либо 18, либо кроме того 31-уровневый конвейер?Программы в большинстве случаев трудятся с процессором, как с тёмным коробкой.

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

Смонтированный в Лос-Аламосской национальной лаборатории Министерства энергетики США вычислительный комплекс Roadrunner выводится из строя из-за «через чур большого энергопотребления».

Программисту полезно знать, что происходит в этого коробки, в особенности, если он будет заниматься оптимизацией программ. Если вы не понимаете какие конкретно процессы протекают в процессора, как вы сможете оптимизировать под него?Эта статья говорит, как устроен вычислительный конвейер x86 процессора.Вещи, каковые вы уже должны знатьВо-первых, предполагается, что вы мало разбираетесь в программировании либо может кроме того мало понимаете ассемблер.

Если вы не осознаёте, что я имею ввиду, в то время, когда использую термин «указатель на инструкцию» (instruction pointer), тогда, быть может, эта статья не для вас. В то время, когда я пишу о регистрах, кэшах и инструкциях, я предполагаю, что вы уже понимаете, это что может значить, имеете возможность осознать либо нагуглить.Во-вторых, эта статья – упрощение сложной темы. В случае если вам думается, что я пропустил какие-то серьёзные моменты, вам очень рады в комментарии.В-третьих, я акцентирую внимание лишь на процессорах Intel x86 семейства.

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

В разработке более новые процессоры, и кое-какие из них уже не так долго осталось ждать ожидаются в продаже. Я весьма рад, что разработки развиваются такими стремительными темпами и надеюсь, что когда-нибудь все стадии, обрисованные ниже, всецело устареют и будут заменены еще более необычными достижениями в процессоростроении.Базы вычислительного конвейераЕсли взглянуть на x86 семейство в целом, то возможно подметить, что оно не очень сильно изменилось за 35 лет.

Было большое количество дополнений, но уникальный дизайн, как и практически целый комплект команд, по большей части остались нетронутыми и до сих пор прослеживаются в современных процессорах.Начальный 8086 процессор имеет 14 регистров, каковые употребляются до сих пор. Четыре регистра неспециализированного назначения – AX, BX, CX и DX. Четыре сегментных регистра, каковые применяют для облегчения работы с указателями – CS (Code Segment), DS (Data Segment), ES (Extra Segment) и SS (Stack Segment).

Четыре индексных регистра, каковые показывают на разные адреса в памяти – SI (Source Index), DI (Destination Index), BP (Base Pointer) и SP (Stack Pointer). Один регистр содержит битовые знамёна. И, наконец, самый главный регистр в данной статье – IP (Instruction Pointer).IP регистр – это указатель с особенной функцией, его задача показывать на следующую инструкцию, которая подлежит выполнению.Все процессоры в x86 семействе следуют одному и тому же принципу.

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

В то время, когда работа окончена, команда проходит через этап отставки (retire stage) и IP начинает показывать на следующую инструкцию.Данный принцип декодирования, отставки и выполнения одинаково используется как в первом 8086 процессоре, так и в самом последнем Core i7. С течением времени были добавлены новые этапы конвейера, но принцип работы не изменился.Что изменилось за 35 летПервые процессоры были несложны по сегодняшним меркам.

8086 процессор начинал с проверки команды на текущем указателе на инструкцию, декодировал ее, делал, отставлял и продолжал работу со следующей инструкцией на которую показывал IP. Любой новый чип в семействе додавал новую функциональность. Большая часть додавало новые инструкции, кое-какие додавали новые регистры.

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

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

В то время кэши данных и руководств измерялись в килобайтах, нежели в байтах.В 1989 i486 процессор перешел на 5-уровневый конвейер. Вместо наличия одной инструкции во всем процессоре, сейчас любой уровень конвейера мог иметь по инструкции. Это новшество разрешило расширить производительность более чем вдвое если сравнивать с 386 процессором на той частоте. Этап загрузки (fetch stage) извлекал команду из кэша руководств (размер кэша в то время жал 8кб).

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

Появление возможности держать в процессоре множество руководств в один момент разрешило программам выполняться значительно стремительнее.1993 год был годом появления процессора Pentium. Наименование семейства процессоров сменилось с номеров на имена из-за суда, исходя из этого оно было названо Pentium вместо 586. Конвейер чипа изменился еще больше если сравнивать с i486.

Архитектура Pentium добавила второй отдельный суперскалярный конвейер. Главный конвейер трудился кроме этого, как и на i486, тогда как второй делал более простые руководства, такие как целочисленная математика, параллельно и намного стремительнее.В 1995 Intel выпустило процессор Pentium Pro, что имел кардинальные трансформации в дизайне. У чипа показалось пара изюминок, включая ядро с внеочерёдным (Out-of-Order, OOO) и упреждающим (Speculative) выполнением команд.

Конвейер был расширен до 12 этапов, и в него вошло что-то, именуемое суперконвейером (superpipeline), где много руководств имело возможность исполняться в один момент. OOO ядро будет более детально освещено ниже в статье.Между 1995 годом, в то время, когда OOO ядро было представлено, и 2002 было сделано большое количество серьёзных трансформаций. Были добавлены дополнительные регистры и представлены инструкции, каковые имели возможность обрабатывать множество данных за раз (Single Instruction Multiple Data, SIMD).

Показались новые кэши, ветхие увеличились в размере. Этапы конвейера делились и объединялись, адаптируясь к требованиям настоящего мира. Эти и многие другие трансформации были ответственны для неспециализированной производительности, но мало что означали, в то время, когда обращение шла о потоке данных через процессор.В 2002 Pentium 4 представил новую разработку — Hyper-Threading. OOO ядро было таким успешным в обработке команд, что способно было обрабатывать инструкции стремительнее, чем они могли быть отправлены ядру.

Для большинства пользователей OOO ядро процессора фактически бездействовало солидную часть времени кроме того под нагрузкой. Для обеспечения постоянного потока руководств к OOO ядру добавили второй фронт-энд. ОС видела два процессора вместо одного.

Процессор содержал два комплекта x86 регистров, два декодера руководств, каковые смотрели за двумя комплектами IP и обрабатывали два комплекта руководств. Потом команды обрабатывались одним неспециализированным OOO ядром, но это было незаметно для программ. Позже руководства проходили этап отставки, как и ранее, и посылались назад к виртуальным процессорам, на каковые они поступали.В 2006 Intel выпустило микроархитектуру Core. В маркетинговых целях она была названа Core 2 (по причине того, что любой знает, что два лучше, чем один).

Неожиданным ходом было отказ частоты и снижение процессоров от Hyper-Threading. Понижение частот содействовало расширению всех этапов вычислительного конвейера. OOO ядро было расширено, кэши и буферы были увеличены.

Архитектура процессоров была переработана с уклоном на двух- и четырёхъядерные чипы с неспециализированными кэшами.В 2008 Intel ввело схему именования процессоров Core i3, Core i5 и Core i7. В этих процессорах снова показался Hyper-Threading с неспециализированным OOO ядром, и отличались они, по большей части, только размерами кэшей.Будущие процессоры: Следующее обновление микроархитектуры, названной Haswell, по слухам, будет выпущено во второй половине 2013.

Размещённые на данный момент документы показывают, что это будет 14-уровневый конвейер, и, наверняка, принцип обработки информации будет все кроме этого направляться дизайну Pentium Pro.Так что же такое данный вычислительный конвейер, что такое OOO ядро и как это все увеличивает скорость обработки?Вычислительный конвейер процессораВ самом несложной форме, обрисованной выше, одиночная инструкция входит в процессор, обрабатывается и выходит иначе. Это достаточно интуитивно для большинства программистов.Процессор i486 имел 5-уровневый конвейер – загрузка (Fetch), главное декодирование (D1), вторичное декодирование либо трансляция (D2), исполнение (EX), запись результата в память и регистры (WB).

Любой этап конвейера имел возможность содержать по инструкции.Конвейер i486 и пять руководств, проходящие через него в один момент.Но такая схема имела большой недочёт. Представьте себе код ниже. До прихода конвейера следующие три строки кода были распространенным методом поменять значения двух переменных без применения третьей.XOR a, b XOR b, a XOR a, b Чипы, начиная с 8086 и до 386 не имели внутреннего конвейера.

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

Следующий ход – первая инструкция входит в D1 этап, вторая инструкция помещается в этап загрузки. Третий ход – первая инструкция двигается в D2 этап, вторая в D1 и третья загружается в Fetch. На следующем шагу что-то идет не так – первая инструкция переходит в EX…, но остальные остаются на месте.

Декодер останавливается, по причине того, что вторая XOR команда требует итог первой. Переменная «a» должна быть использована во второй инструкции, но в неё не будет произведена запись, пока не выполнилась первая инструкция. Исходя из этого команды в конвейере ожидают, пока первая команда не пройдет EX и WB этапы.

Лишь затем вторая инструкция может продолжить собственный путь по конвейеру. Третья команда подобно застрянет в ожидании исполнения второй команды.Такое явление именуется ступор конвейера (pipeline stall) либо конвейерный пузырь (pipeline bubble).Второй проблемой конвейеров есть возможность одних руководств выполняться весьма скоро, а вторых весьма медлительно, что было более заметно с двойным конвейером Pentium.Pentium Pro представил с собой 12-уровневый конвейер.

В то время, когда это число было в первый раз озвучено, то осознававшие как трудился суперскалярный конвейер программисты затаили дыхание. Если бы Intel последовало такому же принципу с 12-уровневым конвейером, то любой ступор конвейера либо медленная инструкция без шуток бы сказывались на производительности. Но одновременно с этим Intel объявило кардинально отличающийся конвейер, названный ядром с внеочерёдным выполнением (OOO core).

Не обращая внимания на то, что это тяжело было осознать из документации, Intel заверило разработчиков, что они будут потрясены результатами.Давайте разберем OOO ядро более подробно.OOO конвейерВ случае с OOO ядром, иллюстрация стоит тысячи слов. Так что давайте посмотрим пара картин.Диаграмы конвейеров процессора5-уровневый конвейер i486 трудился превосходно.

Эта мысль была достаточно распространена среди вторых семейств процессоров в то время и трудилась превосходно в настоящих условиях.Суперскалярный конвейер i486.Конвейер Pentium был кроме того значительно лучше i486. Он имел два вычислительных конвейера, каковые имели возможность трудиться параллельно, и любой из них имел возможность содержать множество руководств на разных стадиях, разрешая вам обрабатывать практически в двое больше руководств за то же время.Два параллельных суперскалярных конвейера Pentium.Но наличие стремительных команд, ожидающих исполнение медленных, было все кроме этого проблемой в параллельных конвейерах, как и наличие последовательных команд (привет ступор).

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

Кое-какие этапы и буферы не продемонстрированы, поскольку варьируются от процессора к процессору.Сперва руководства загружаются из памяти и помещаются в кэш руководств процессора. Декодер современного процессора может угадать появление скорого ветвления (к примеру вызов функции) и начать загрузку руководств заблаговременно.Этап декодирования был мало поменян если сравнивать с более ранними чипами. Вместо обработки только одной инструкции на IP, Pentium Pro имел возможность декодировать до трех руководств за такт.

Сегодняшние процессоры (2008-2013) смогут декодировать до четырёх руководств за такт. Результатом декодирования являются микрооперации (micro-ops / µ-ops).Следующий этап (либо несколько этапов) складывается из трансляции микроопераций (micro-op transaltion) и последующего присвоения псевдонимов регистрам (register aliasing). Множество операций выполняются в один момент, вероятно внеочерёдно, исходя из этого одна инструкция может просматривать из регистра, пока вторая в него пишет.

Запись в регистр может подавить значение, необходимое второй инструкции. Уникальные регистры в процессора (AX, BX, CX, DX итд.) транслируются (либо создаются псевдонимы) во внутренние, скрытые от программиста регистры. Значение регистров и адресов памяти после этого должны быть привязаны к временным значениям для обработки. Сейчас 4 микрооперации смогут проходить через этап трансляции за такт.По окончании трансляции все микрооперации входят в буфер переупорядочивания (reorder buffer, ROB).

Сейчас данный буфер может вмещать до 128 микроопераций. На процессорах с HT ROB кроме этого может выступать в роли координатора входных команд с виртуальных процессоров, распределяя два потока команд на одно OOO ядро.Сейчас микрооперации готовы для обработки и помещаются в резервацию (reservation station, RS). RS сейчас может вмещать 36 микроопераций в любую секунду времени.Сейчас настало время для волшебства OOO ядра.

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

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

В совершенных условиях аккуратные блоки Pentium Pro имели возможность обрабатывать семь микроопераций за такт.Сегодняшнее OOO ядро кроме этого содержит шесть аккуратных блоков. Оно до сих пор содержит блоки загрузки адреса, сохранения и сохранения адреса данных. Но остальные три мало изменились. Любой из трех блоков сейчас может делать простые математические операции либо более сложную микрооперацию.

Любой из трех блоков специален для конкретных микроопераций, разрешая делать работу стремительнее, если сравнивать с блоками неспециализированного назначения. В совершенных условиях нынешнее OOO ядро может обрабатывать 11 микроопераций за такт.Наконец микрооперация начинает выполняться. Она проходит через более небольшие этапы (отличающиеся между процессорами) и проходит этап отставки. Сейчас микрооперация возвращается во внешний мир и IP начинает показывать на следующую инструкцию.

С позиций программы, инструкция в процессор и выходит иначе, совершенно верно так же, как это было со ветхим 8086.Если вы пристально просматривали статью, вы вероятно имели возможность подметить крайне важную проблему в описании выше. Что случится при смены места выполнения? К примеру, что случится, в случае если код доходит до if либо switch конструкции?

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

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

Как раз тут приходит на помощь еще одна серьёзная изюминка OOO ядра.Их ответ был – упреждающее исполнение. Упреждающее исполнение свидетельствует, что в то время, когда OOO ядро встречает в коде условные конструкции (к примеру if блок), оно просто загрузит и выполнит две ветки кода. Когда ядро осознаёт, какая ветка верная, результаты второй будут скинуты. Это предотвращает ступор конвейера ценой малых издержек на запуск кода в неверной ветке.

Кроме этого был добавлен кэш для предсказания ветвления (branch prediction cache), что намного улучшил результаты в обстановках, в то время, когда ядро было вынуждено прогнозировать среди множества условных переходов. Ступоры конвейера до сих пор видятся из-за ветвления, но это решение разрешило сделать их редким исключением, нежели простым явлением.Ну и наконец, процессор с HT предоставляет два виртуальных процессора для одного неспециализированного OOO ядра.

Они разделяют неспециализированный ROB и OOO ядро и будут видны для ОС как два отдельных процессора. Это выглядит приблизительно так:OOO ядро с Hyper-Threading, см. примечание.Процессор с HT приобретает два виртуальных процессора, каковые вместо поставляют больше данных OOO ядру, что дает повышение производительности при простом пользовании. Только кое-какие тяжелые вычислительные нагрузки, оптимизированные под многопроцессорные совокупности, смогут всецело загрузить OOO ядро.

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

Это тёмный ящик. Инструкция, на которую показывает IP, обрабатывается этим коробкой, и, в то время, когда инструкция выходит из него, результаты уже отображены в памяти. Не смотря на то, что с позиций инструкции, данный тёмный ящик то ещё приключение.Ниже приводится путь, что совершает инструкция в современном процессоре (2008-2013).Отправились, вы – инструкция в программе, и эта программа запускается.Вы терпеливо ожидаете, пока IP начнет показывать на вас для обработки.

В то время, когда IP показывает приблизительно за 4кб до вашего размещения, либо за 1500 руководств, вы перемещаетесь в кэш руководств. Загрузка в кэш занимает некое время, но это не страшно, поскольку вы ещё нескоро станете запущены. Эта предзагрузка (prefetch) есть частью первого этапа конвейера.Тем временем IP показывает всё ближе и ближе к вам, и, в то время, когда он начинает показывать за 24 инструкции до вас, вы и пять соседних команд отправляетесь в очередь руководств (instruction queue).

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

Декодер зафиксировал потребность в дополнительных данных. Без вашего участия, где-то на втором финише компьютера, необходимые вам эти начинают загрузку в кэш данных.Ваши четыре микрооперации подходят к таблице псевдонимов регистров. Вы объявляете с какого именно адреса памяти вы просматриваете (это выясняется fs:[eax+18h]), и чип показывает его во временный адрес для ваших микроопераций.

Ваши микрооперации входят в ROB, откуда, при первой же возможности, двигаются в резервацию. Резервация содержит инструкции, готовые к выполнению. Ваша третья микрооперация срочно подхватывается пятым портом выполнения. Вам не известно, из-за чего она была выбрана первой, но её уже нет. Через пара тактов ваша первая микрооперация устремляется во второй порт, блок загрузки адресов. Оставшиеся микрооперации ожидают, пока разные порты подхватывают другие микрооперации.

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

Все микрооперации запущены и со временем они снова видятся в резервации.По пути обратно через ворота, микрооперации передают собственные билеты с временными адресами. Микрооперации планируют и объединяются, и вы снова, как инструкция, ощущаете себя единым целым. Процессор вручает вам ваш итог и культурно направляет к выходу.

Через дверь с пометкой “Отставка” стоит маленькая очередь. вы поднимаетесь в очередь и обнаруживаете, что вы стоите за той же инструкцией, за которой и заходили. Вы кроме того стоите в том же порядке. Получается, что OOO ядро вправду знает собственное дело.Со стороны выглядит так, что любая выходящая из процессора команда выходит по одной, совершенно верно в таком же порядке, в каком IP показывал на них.ЗаключениеНадеюсь, что эта маленькая лекция пролила мало света на то, что происходит в процессора.

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

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

Хороший программист либо оптимизирующий компилятор может вынудить множество руководств исполняться за среднее время близкое к нулю. Среднее время близкое к нулю – это не время выполнения самой медленной инструкции, а время, требуемое для прохождения инструкции через OOO время и ядро, требуемое кэшу для выгрузки и загрузки данных.Что означает, в то время, когда новый процессор имеет 12, либо 18, либо кроме того 31-уровневый конвейер? Это значит, что больше руководств за раз смогут быть приглашены на вечеринку.

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

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

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

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

разметки и Правильный выбор структуры данных может заметно сказаться на увеличении производительности. , пока код и ваши данные остаются несложными, вы в большинстве случаев имеете возможность положиться на работу оптимизирующего компилятора.Благодарю, что были частью этого путешествия.Оригинал — www.gamedev.net/page/resources/_/technical/general-programming/a-journey-through-the-cpu-pipeline-r3115

Случайная статья:

Процессорный конвейер команд. История процессоров (часть 2)


Похожие статьи:

  • Как приручить ядро процессора*

    В данной статье рассказывается о этапах загрузки ядер процессоров серии QoriQ и участии в этом загрузчика u-boot, и о исполнении раздельно забранной…

  • Путешествие с lg g3: часть вторая

    В первой части рассказа о путешествии LG G3 мы поведали о самые выдающихся внешних талантах устройства и мало поболтали о производительности. Сейчас…

  • Как узнать разрядность процессора?

    Сейчас все чаще возможно слышать от производителей компьютерных комплектующих и создателей ПО упоминание о том, что их детища поддерживают работу либо…

Комментирование и размещение ссылок запрещено.

Обсуждение закрыто.