Статьи
Почему процессор Apple M1 такой быстрый?
Появляется все больше информации о реальном опыте работы с новыми Mac M1. Они быстрые. Очень быстрые. Но почему? Что за магия?
Появляется все больше информации о реальном опыте работы с новыми Mac M1. Они быстрые. Очень быстрые. Но почему? Что за магия?
На YouTube я смотрел видео пользователя Mac, который в прошлом году купил iMac. Он использовал 40 ГБ оперативной памяти, что обошлось ему примерно в 4000 долларов. И сейчас он с недоумением наблюдал, как новый M1 Mac Mini, за который он заплатил жалкие 700 долларов, обгоняет сверхдорогой iMac.
В реальных условиях, тест за тестом, компьютеры Mac M1 не просто немного обгоняют топовые компьютеры Mac с Intel, но просто уничтожают их. С недоверием люди начали спрашивать, как это вообще возможно?
Если вы один из таких людей, вы попали в нужное место. Здесь я планирую внятно рассказать, что же Apple сделала с M1. В частности, я думаю, что у многих людей возникают следующие вопросы:
- Каковы технические причины того, что чип M1 такой быстрый?
- Реализовала ли Apple действительно экзотические технические решения, чтобы добиться этого?
- Насколько легко будет таким конкурентам, таким как Intel и AMD, применить эти же технические приемы?
Конечно, вы можете попробовать поискать это в Google, но если вы попытаетесь узнать, что же сделала Apple, помимо поверхностных объяснений вас быстро захлестнет высокотехничный жаргон, вроде “в M1 используются очень широкие декодеры инструкций, огромный буфер переупорядочения (ROB)” и т.д. Если вы не фанат аппаратного обеспечения и процессоров, многое из этого для вас будет просто непонятно.
Чтобы получить максимальную отдачу от этой истории, я советую прочитать мою предыдущую статью: «Что означают RISC и CISC в 2020 году?» Там я объясняю, что такое микропроцессор (CPU, ЦП), а также различные важные концепции.
Но если вы нетерпеливы, я сделаю краткие выводы, которые вам нужно изучить, чтобы понять мое объяснение M1.
Что такое микропроцессор (CPU)?
Обычно, говоря о чипах Intel и AMD, мы говорим о центральных процессорах (CPU) или микропроцессорах. Как вы можете больше узнать в моей истории о RISC и CISC, они обрабатывают инструкции в памяти. Обычно это выполняется последовательно.
CPU на самом базовом уровне — это устройство с рядом именованных ячеек памяти, называемых регистрами, и рядом вычислительных блоков, называемых арифметико-логическими блоками (ALU). ALU выполняют такие вещи, как сложение, вычитание и другие основные математические операции. Однако они связаны только с регистрами ЦП. Если вы хотите сложить два числа, вы должны получить эти два числа из памяти в два регистра процессора.
Вот несколько примеров типичных инструкций, которые выполняет RISC-процессор, установленный на M1.
load r1, 150 load r2, 200 add r1, r2 store r1, 310
Здесь r1 и r2 — это регистры, о которых я говорил. Современные процессоры RISC не могут выполнять операции с числами, которые не находятся в регистрах, подобных этим. Например, процессор не может сложить два числа, находящихся в ОЗУ в двух разных местах. Вместо этого он должен вывести эти два числа в отдельные регистры. Вот что мы делаем в этом простом примере. Мы извлекаем число из ячейки памяти 150 в памяти и помещаем его в регистр r1 в CPU. Затем мы помещаем содержимое адреса 200 в регистр r2. Только после этого числа можно складывать с помощью инструкции add r1, r2.
Концепция регистров стара. Например, на этом старом механическом калькуляторе регистр — это то, что содержит числа, которые вы добавляете. Вероятно от этого произошло само название термина кассовый аппарат (cash register) — в регистрах вы “регистрировали” вводимые числа.
M1 — это не CPU!
Но вот что нужно знать о M1.
M1 — это не процессор, это целая система из нескольких микросхем, помещенных в одну большую кремниевую систему. Центральный процессор — лишь одна из таких микросхем.
По сути, M1 — это целый компьютер на микросхеме. M1 содержит CPU, графический процессор (GPU), память, контроллеры ввода и вывода и многое другое, составляющее целый компьютер. Это то, что мы называем системой на кристалле (SoC).
Сегодня, если вы покупаете чип — будь то Intel или AMD — вы фактически получаете то, что составляет несколько микропроцессоров в одном корпусе. В прошлом компьютеры имели несколько физически отдельных микросхем на материнской плате компьютера.
Однако, поскольку сегодня мы можем разместить так много транзисторов на одном кремниевом кристалле, такие компании, как Intel и AMD, начали размещать несколько микропроцессоров на одном. Сегодня мы называем эти чипы ядрами процессора. Одно ядро — это, по сути, полностью независимый процессор, который может читать инструкции из памяти и выполнять вычисления.
В это долгое время играли для повышения производительности — просто добавьте больше ядер общего назначения. Но потом в силе почувствовалось возмущение. На рынок процессоров вышел один игрок, который отклонился от этой тенденции.
Не такая уж секретная стратегия Apple в отношении гетерогенных вычислений
Вместо того, чтобы добавлять все больше ядер общего назначения, Apple последовала другой стратегии: они начали добавлять все больше специализированных чипов, выполняющих специализированные задачи. Преимущество этого состоит в том, что специализированные чипы, как правило, могут выполнять свои задачи значительно быстрее, используя гораздо меньший энергии, чем ядро процессора общего назначения.
Это не совсем новое знание. Уже много лет специализированные чипы, такие как графические процессоры (GPU), используются в видеокартах Nvidia и AMD, выполняя операции, связанные с графикой, гораздо быстрее, чем процессоры общего назначения.
Apple просто сделала более радикальный сдвиг в этом направлении. M1 содержит не только ядра и память общего назначения, но и множество специализированных сопроцессоров:
- Центральный процессор (CPU) — «мозг» SoC. Выполняет большую часть кода операционной системы и ваших приложений.
- Графический процессор (GPU) — обрабатывает задачи, связанные с графикой, такие как визуализация пользовательского интерфейса в приложениях и в 2D/3D играх.
- Блок обработки изображений (ISP) — может использоваться для ускорения общих задач, выполняемых при обработке изображений.
- Цифровой сигнальный процессор (DSP) — выполняет более сложные математические функции, чем ЦП. Включая декомпрессию музыкальных файлов.
- Блок нейронной обработки (NPU) — используется в смартфонах для ускорения задач машинного обучения (ИИ). К ним относятся распознавание голоса и компьютерное зрение.
- Видео кодер/декодер — обеспечивает энергоэффективное преобразование видеофайлов и форматов.
- Безопасный анклав — шифрование, аутентификация и безопасность.
- Унифицированная память — позволяет процессору, графическому процессору и другим ядрам быстро обмениваться информацией.
Это одна из причин, по которой многие люди, работающие над изображениями и редактированием видео с Mac M1, видят такое увеличение скорости. Многие из выполняемых ими задач могут выполняться непосредственно на специализированных процессорах. Это то, что позволяет дешевому M1 Mac Mini быстро кодировать большой видеофайл, в то время как на дорогом iMac все кулеры работают на полную мощность, но все равно компьютер не успевает за своим собратом.
Что особенного в архитектуре унифицированной памяти Apple?
«Унифицированную архитектуру памяти» (UMA) от Apple немного сложно понять (я сам ошибся в первый раз, когда разбирался с ней).
Чтобы объяснить почему, нам нужно сделать несколько шагов назад.
В течение долгого времени в дешевых компьютерных системах CPU и GPU были интегрированы в один и тот же чип (один и тот же кремниевый кристалл). Это было чудовищно медленно. В прошлом выражение «интегрированная графика» было по сути тем же, что и «медленная графика».
Такие системы были медленными по нескольким причинам:
Отдельные области этой памяти были зарезервированы для CPU и GPU. Если бы у процессора был фрагмент данных, который он хотел бы использовать для графического процессора, он не мог бы сказать «вот здесь часть моей памяти». Нет, ЦП должен был явно скопировать весь блок данных в область памяти, контролируемую ГП.
Процессоры и графические процессоры не хотят, чтобы их память работала одинаково. Давайте проведем глупую аналогию с едой: процессоры хотят, чтобы их тарелка с данными была подана официантом очень быстро, но они готовы ограничиться небольшими размерами порций. Представьте себе модный французский ресторан с официантами на роликовых коньках, которые обслужат вас очень быстро.
Графические процессоры, напротив, крутые, поскольку могут подождать. Но графическим процессорам нужны огромные порции. Они поглощают огромные объемы данных, потому что они представляют из себя множество параллельных машин, которые могут обрабатывать большое количество данных параллельно. Представьте себе американское заведение с мусорной пищей, где еда доставляется через некоторое время, потому что к вам за столик привозят целую тележку с едой.
При таких разных потребностях размещение процессоров и графических процессоров на одном физическом чипе было не лучшей идеей. Графические процессоры сидели бы голодными, получая небольшие порции овощей. В результате не было смысла ставить мощные графические процессоры на SoC. Крошечные порции данных могут быть легко скушаны и маленьким слабым графическим процессором.
Вторая проблема заключалась в том, что большие графические процессоры выделяют много тепла, и поэтому вы не можете интегрировать их с процессором, не избавившись от выделяемого тепла. Таким образом, дискретные видеокарты обычно выглядят так, как показано ниже. Огромные платы с массивными вентиляторами охлаждения. У них есть специальная выделенная память, предназначенная для обслуживания жадных до огромных объемов данных процессоров.
Поэтому у таких карт высокая производительность. Но у них есть ахиллесова пята: всякий раз, когда им нужно получить данные из памяти, используемой CPU, это происходит по набору медных дорожек на материнской плате компьютера, называемой шиной PCIe. Попробуйте набрать воду через супертонкую соломинку. Он может быстро добраться до вашего рта, но пропускная способность совершенно недостаточна.
Архитектура унифицированной памяти Apple пытается решить все эти проблемы, не имея недостатков старой разделяемой памяти. Они достигают этого следующими способами:
- Нет специальной области памяти, зарезервированной только для CPU или только для GPU. Память выделяется на оба процессора. Они оба могут использовать одну и ту же память. Копирования не требуется.
- Apple использует память, которая может обслуживать как большие блоки данных, так и делать это быстро. На компьютерном языке это называется низкой задержкой и высокой пропускной способностью. Таким образом отпадает необходимость подключения к отдельным типам памяти.
- Apple снизила потребление мощности графическим процессором, так что относительно мощный графический процессор можно интегрировать без перегрева в SoC. А чипы ARM выделяют меньше тепла, что позволяет графическому процессору иметь больший “тепловой бюджет”, чем графический процессор на том же кремниевом кристалле, что и процессор AMD или Intel.
Некоторые скажут, что объединенная память не новая концепция. Это правда, в прошлом это встречалось в разных системах. Но тогда разница в требованиях к памяти могла быть не такой большой. Во-вторых, то, что Nvidia называет объединенной памятью (Unified Memory), на самом деле не тоже самое. В мире Nvidia унифицированная память просто означает наличие программного и аппаратного обеспечения, которое заботится об автоматическом копировании данных между отдельными CPU и GPU. Таким образом, с точки зрения программистов, Apple и Nvidia Unified Memory могут выглядеть одинаково, но в физическом смысле это не одно и то же.
Конечно, в этой стратегии есть компромисс. Реализация этой памяти с высокой пропускной способностью (и с большими порциями) требует полной интеграции, что означает, что вы лишаете клиентов возможности апгрейдить память. Но Apple стремится свести к минимуму эту проблему, сделав связь с SSD-дисками настолько быстрой, что они по сути работают как память предыдущего поколения.
Если SoC настолько хороши, почему Intel и AMD не копируют эту стратегию?
Если то, что делает Apple, настолько умно, почему этого не делают все? В некоторой степени они делают. Другие производители микросхем ARM все чаще устанавливают специализированное оборудование.
AMD также начала устанавливать более мощные графические процессоры на некоторые из своих чипов и постепенно переходить к той или иной форме SoC с ускоренными процессорами (accelerated processing units, APU), которые в основном представляют собой CPU и GPU ядра, размещенные на одном кремниевом кристалле.
Однако есть важные причины, по которым они не могут этого сделать. SoC — это, по сути, целый компьютер на кристалле. Это делает его более подходящим для реальных производителей компьютеров, таких как HP и Dell. Позвольте мне прояснить глупую аналогию с автомобилем: если ваша бизнес-модель заключается в создании и продаже автомобильных двигателей, было бы необычным шагом начать производство и продажу целых автомобилей.
Для ARM, напротив, это не проблема. Производители компьютеров, такие как Dell или HP, могут просто лицензировать интеллектуальную собственность ARM и покупать ее для других чипов, чтобы добавить любое специализированное оборудование, которое, по их мнению, должно иметь их SoC. Затем они отправляют готовую конструкцию на завод по производству полупроводников, такой как GlobalFoundries или TSMC, который сегодня производит чипы для AMD и Apple.
Здесь мы получаем большую проблему с бизнес-моделью Intel и AMD. Их бизнес-модели основаны на продаже процессоров общего назначения, которые просто устанавливаются на большую материнскую плату ПК. Таким образом, производители компьютеров могут просто покупать материнские платы, память, процессоры и видеокарты у разных поставщиков и интегрировать их в одно решение.
Но мы быстро уходим от этого мира. В новом мире SoC вы не собираете физические компоненты от разных производителей. Вместо этого вы собираете IP (интеллектуальную собственность) от разных поставщиков. Вы покупаете дизайн для видеокарт, процессоров, модемов, контроллеров ввода-вывода и других вещей у разных поставщиков и используете его для проектирования SoC собственными силами. А потом отправляете чертежи на завод, который его изготовит.
Большая проблема в том, что ни Intel, ни AMD, ни Nvidia не собираются передавать лицензию на свою интеллектуальную собственность Dell или HP, чтобы они могли создавать SoC для своих машин.
Конечно, Intel и AMD могут просто начать продавать готовые SoC целиком. Но что они должны содержать? Производители ПК могут иметь разные представления об этом. Вы можете столкнуться с конфликтом между Intel, AMD, Microsoft и производителями ПК по поводу того, какие специализированные чипы должны быть включены в компьютер, поскольку для них потребуется поддержка программного обеспечения.
Для Apple это просто. Они контролируют всю экосистему. Они предоставляют вам, например, библиотеку Core ML, чтобы вы могли заниматься, например, машинным обучением. Независимо от того, работает ли Core ML на процессоре Apple или на Neural Engine, разработчикам не нужно заботиться о деталях реализации.
Фундаментальная задача — заставить любой процессор работать быстро
Итак, гетерогенные вычисления — это часть причины, но не единственная часть. Быстрые ядра общего назначения на M1, называемые Firestorm, действительно быстрые. Это серьезное отличие от CPU ядер ARM, существовавших в прошлом, которые, как правило, были очень слабыми по сравнению с ядрами AMD и Intel.
Firestorm, напротив, превосходит большинство ядер Intel и почти превосходит самые быстрые ядра AMD Ryzen. Принято считать, что этого не произойдет.
Прежде чем говорить о том, что делает Firestorm быстрыми, стоит понять, в чем на самом деле основная идея создания быстрого процессора.
В принципе, вы добиваетесь сочетания двух стратегий:
- Выполнять инструкции быстрее.
- Выполнять инструкции параллельно.
В 80-е это было легко. Просто увеличьте тактовую частоту, и инструкции будут выполняться быстрее. Каждый такт — это когда компьютер что-то делает. Но этого чего-то может быть немного. Таким образом, для выполнения инструкции может потребоваться несколько тактов, поскольку она состоит из нескольких более мелких подзадач.
Однако сегодня повысить тактовую частоту практически невозможно. В этом весь «Конец закона Мура», о котором люди твердят уже более десяти лет.
Таким образом, на самом деле речь идет о параллельном выполнении как можно большего числа инструкций.
Многоядерные или внеочередные процессоры?
Есть два подхода к этому.
- Добавить больше CPU ядер. Каждое ядро работает независимо и параллельно.
- Заставить каждое ядро выполнять несколько инструкций параллельно.
Для разработчика программного обеспечения добавление ядер похоже на добавление потоков. Каждое ядро процессора похоже на аппаратный поток.
Если вы не знаете, что такое поток, вы можете думать о нем как о процессе выполнения задачи. С двумя ядрами CPU может одновременно выполнять две отдельные задачи: два потока. Задачи можно описать как две отдельные программы, хранящиеся в памяти, или это может быть одна и та же программа, выполняемая дважды. Каждый поток требует некоторого учета, например того, где в последовательности программных инструкций поток в данный момент находится. Каждый поток может хранить временные результаты, которые следует хранить отдельно.
В принципе, процессор может иметь только одно ядро и запускать несколько потоков. В этом случае он просто останавливает один поток и сохраняет текущий прогресс перед переключением на другой. Позже переключается обратно. Это не приведет к значительному повышению производительности, если только поток не должен часто останавливаться, чтобы:
- Дождаться ввода от пользователя.
- Данных из медленного сетевого подключения и т.д.
Назовем это программными потоками. Аппаратные потоки означают, что в вашем распоряжении есть реальные физические ядра процессора для ускорения работы.
Проблема с потоками заключается в том, что разработчикам программного обеспечения приходится писать так называемый многопоточный код. Часто это бывает сложно. В прошлом это была одна из самых сложных частей программ для написания. Однако сделать серверное программное обеспечение многопоточным обычно несложно. Это просто вопрос обработки каждого пользовательского запроса в отдельном потоке. Таким образом, в данном случае наличие большого количества ядер является очевидным преимуществом. Особенно для облачных сервисов.
Вот почему вы видите, что производители процессоров ARM, такие как Ampere, производят такие процессоры, как Altra Max с сумасшедшими 128 ядрами. Этот чип специально создан для облаков. Вам не нужна безумная одноядерная производительность, потому что в облаке главное — иметь как можно больше потоков на ватт для обработки как можно большего количества одновременных пользователей.
Apple, напротив, находится на совершенно противоположном конце спектра. Они делают однопользовательские устройства. Большое количество потоков не является преимуществом. Их устройства используются для игр, редактирования видео, разработки и т.д. Им нужны десктопы с красивой адаптивной графикой и анимацией.
Программное обеспечение для настольных ПК обычно не требует использования большого количества ядер. Например, компьютерные игры, вероятно, выиграют от восьми ядер, но что-то вроде 128 ядер будет пустой тратой. Вместо этого вам нужно меньше, но более мощных ядер.
Как работает внеочередное исполнение
Чтобы сделать ядро более мощным, нам нужно, чтобы оно выполняло больше инструкций параллельно. Выполнение вне очереди (Out-of-Order execution, OoOE) — это способ выполнять больше инструкций параллельно, но не раскатывая эту возможность в виде нескольких потоков.
Разработчикам не нужно специально затачивать свое программное обеспечение, чтобы воспользоваться преимуществами OoOE. С точки зрения разработчика просто выглядит так, что каждое ядро работает быстрее. Обратите внимание, что это не прямая альтернатива аппаратным потокам. Вы можете использовать оба подхода, в зависимости от конкретной проблемы, которую вы решаете.
Чтобы понять, как работает OoOE, вам нужно кое-что понять о памяти. Запрос данных из одного конкретного места памяти выполняется медленно. Но CPU может получать много последовательных байт одновременно. Следовательно, получение 1 определенного байта в памяти занимает не меньше времени, чем получение дополнительных 100 байтов, которые следуют после этого байта в памяти.
Приведем аналогию: рассмотрим сборщиков на складе. Это могут быть маленькие красные роботы, как на картинке выше. Переезд из одного места в другое требует времени. Но собирать предметы из соседних друг с другом слотов можно быстро. Компьютерная память очень похожа. Вы можете быстро получить содержимое смежных ячеек памяти.
Данные отправляются через то, что мы называем шиной данных. Вы можете думать об этом как о дороге или трубе между памятью и различными частями CPU, через которые проходят данные. На самом деле это, конечно, просто медные дорожки, проводящие электричество. Если шина данных достаточно широкая, вы можете получить несколько байтов одновременно.
Таким образом, процессоры получают для выполнения целый блок инструкций за раз. Но они написаны для выполнения один за другим. Современные микропроцессоры делают то, что мы называем внеочередным исполнением (OoOE).
Это означает, что они могут быстро анализировать буфер инструкций и увидеть, какие из них от каких зависят. Посмотрите на простой пример ниже:
01: mul r1, r2, r3 // r1 ← r2 × r3 02: add r4, r1, 5 // r4 ← r1 + 5 03: add r6, r2, 1 // r6 ← r2 + 1
Умножение — медленный процесс. Скажем, для выполнения требуется несколько тактов. Второй инструкции просто придется ждать, потому что ее расчет зависит от знания результата, который помещается в регистр r1.
Однако третья инструкция в строке 03 не зависит от вычислений из предыдущих инструкций. Следовательно, процессор вне очереди может начать вычисление этой инструкции параллельно.
Однако в реальности речь идет о сотнях инструкций. CPU может определить все зависимости между этими инструкциями.
Он анализирует инструкции, просматривая входные данные для каждой инструкции. Зависит ли ввод от вывода одной или нескольких других инструкций? Под вводом и выводом мы понимаем регистры, содержащие результаты предыдущих вычислений.
Например, команда add r4, r1, 5 зависит от r1, который производится как mul r1, r2, r3. Мы можем связать эти отношения в длинные сложные графы, с которыми может работать ЦП. Узлы — это инструкции, а ребра — это регистры, соединяющие их.
CPU может анализировать такой граф и определять, какие инструкции он может выполнять параллельно, а где ему нужно дождаться результатов нескольких зависимых вычислений, прежде чем продолжить.
Многие инструкции заканчиваются раньше, но мы не можем сделать их результаты официально доступными. Мы не можем их совершить; в противном случае мы предоставим результат в неправильном порядке. Для остального мира это должно выглядеть так, как если бы инструкции выполнялись в той же последовательности, в которой они были даны.
Подобно стеку, CPU будет отправлять готовые инструкции сверху, пока не встретит невыполненную инструкцию.
По сути, у вас есть две формы параллелизма: одна, с которой разработчик должен иметь дело явно при написании кода, и вторая, которая полностью прозрачна. Конечно, последняя полагается на множество транзисторов в чипе, которые образуют магию внеочередного выполнения. Это не жизнеспособное решение для небольших процессоров с небольшим количеством транзисторов.
Но внеочередное исполнение это превосходное решение, которое заставляет ядра Firestorm на M1 обгонять всех и плевать на громкие имена с высокой колокольни. На самом деле оно намного сильнее, чем что-либо от Intel или AMD, и они, возможно, никогда не смогут его догнать. Чтобы понять, почему, нам нужно более подробно остановиться на технических деталях.
Инструкции ISA против микроопераций
Ранее я пропустил некоторые подробности о том, как работает Out-of-Order Execution.
Программы, загружаемые в память, состоят из инструкций машинного кода, разработанных для определенных архитектур (Instruction-Set Architectures, ISA), таких как x86, ARM, PowerPC, 68K, MIPS, AVR и т.д.
Например, инструкцию x86 для извлечения числа из ячейки памяти 24 в регистр вы можете записать:
MOV ax, 24
x86 имеют регистры с именами ax, bx, cx и dx (помните, что это ячейки памяти внутри процессора, с которыми вы выполняете операции). Однако эквивалентная инструкция ARM будет выглядеть так:
LDR r0, 24
Процессоры AMD и Intel понимают x86 ISA, в то время как чипы Apple Silicon, такие как M1, понимают наборы команд ARM.
Однако внутри CPU работает с совершенно другим набором инструкций, невидимым для программиста. Мы называем их микрооперациями (или μops). Это инструкции, с которыми работает внеочередное исполнение.
Но почему оборудование OoOE не может работать с обычными инструкциями машинного кода? Потому что ЦП должен добавлять к инструкциям много различной информации, чтобы иметь возможность выполнять их параллельно.
Таким образом, хотя обычная инструкция ARM может быть 32-битной, микрооперация может быть намного длиннее. Она содержит информацию о ее порядке.
01: mul r1, r2, r3 // r1 ← r2 × r3 02: add r4, r1, 5 // r4 ← r1 + 5 03: add r6, r2, 1 // r1 ← r2 + 1
Предположим, что мы запускаем инструкции 01: mul и 03: add параллельно. Оба сохраняют свой результат в регистре r1. Если мы напишем результат инструкции 03: add перед 01: mul, то инструкция 02: add получит неверные данные. Следовательно, очень важно следить за порядком инструкций. Порядок сохраняется с каждой микрооперацией. В ней также хранится, например, то, что инструкция 02: add зависит от вывода 01: mul.
Вот почему у нас не может быть программ, написанных с использованием микроопераций. Они содержат множество деталей, относящихся к внутреннему устройству каждого микропроцессора. Два процессора ARM могут иметь очень разные внутренние микрооперации.
Кроме того, процессору проще работать с микрооперациями. Почему? Потому что каждая из них выполняет одну простую ограниченную задачу. Обычные инструкции ISA могут быть более сложными, что приводит к возникновению множества процессов и, таким образом, часто одна инструкция переводится в несколько микроопераций. Таким образом, название «микро» происходит от небольшой задачи, которая выполняется, а не от длины инструкции в памяти.
Для процессоров CISC обычно нет альтернативы, кроме использования микроопераций, в противном случае большие сложные инструкции CISC сделают конвейеры и OoOE практически невозможными.
У RISC-процессоров есть выбор. Так, например, меньшие по размеру процессоры ARM могут вообще не использовать микрооперации. Но это также будет означать, что они не могут делать такие вещи, как OoOE.
Почему OoOE в исполнении AMD и Intel уступает M1?
Но вы задаетесь вопросом, почему все это имеет значение? Почему важно знать эту деталь, чтобы понять, почему Apple превосходит AMD и Intel?
Это связано с тем, что возможность быстрой работы зависит от того, насколько быстро вы можете заполнить буфер микроопераций. Если у вас большой буфер, то схемам OoOE будет легче найти две или более инструкций, которые оно может выполнять параллельно. Но нет смысла иметь большой буфер инструкций, если вы не сможете достаточно быстро выбирать и выполнять инструкции.
Возможность быстрого пополнения буфера инструкций зависит от способности быстро разбивать инструкции машинного кода на микрооперации. Аппаратные устройства, которые это делают, называются декодерами.
И, наконец, мы подошли к убийственной особенности M1. У самых больших и самых маленьких микропроцессоров Intel и AMD в общей сложности четыре декодера, которые режут инструкции машинного кода на микрооперации.
Но это не подходит для M1, у которого абсолютно неслыханное количество декодеров: восемь. Значительно больше, чем кто-либо другой в отрасли. Это означает, что он может заполнить буфер инструкций намного быстрее.
Чтобы справиться с этим, M1 также имеет буфер команд, который в 3 раза больше, чем принято в отрасли.
Почему Intel и AMD не могут добавить дополнительные декодеры инструкций?
Здесь мы наконец видим реванш RISC, и здесь начинает иметь значение тот факт, что ядро M1 Firestorm имеет архитектуру ARM RISC.
Видите ли, инструкция x86 может иметь длину от 1 до 15 байт. Инструкции RISC имеют фиксированную длину. Каждая инструкция ARM имеет длину 4 байта. Почему это актуально в данном случае?
Потому что разделение потока байтов на инструкции для параллельной подачи в восемь разных декодеров становится тривиальным, если все инструкции имеют одинаковую длину.
Однако в процессоре x86 декодеры не знают, где начинается следующая инструкция. Они должны фактически анализировать каждую инструкцию, чтобы узнать, какова ее длина.
Intel и AMD борются с этим методом грубой силы, просто пытаясь декодировать инструкции во всех возможных отправных точках. Это означает, что чипам x86 приходится иметь дело с множеством ошибочных предположений и ошибок, от которых нужно отказаться. Это создает такое запутанное и сложное построение декодеров, что действительно сложно добавлять дополнительные. Но для Apple продолжать добавлять новые — это тривиально.
Фактически, добавление большего количества вызывает столько других проблем, что четыре декодера, согласно самой AMD, по сути, являются для них верхним пределом.
Это то, что позволяет ядрам M1 Firestorm обрабатывать вдвое больше инструкций, чем процессорам AMD и Intel при той же тактовой частоте.
В качестве контраргумента можно было бы возразить, что инструкции CISC превращаются в большее количество микроопераций. Например, если каждая инструкция x86 превратилась в 2 микрооперации, а каждая инструкция ARM превратилась в одну микрооперацию, тогда четыре декодера x86 будут производить такое же количество микроопераций за такт, как процессор ARM с 8 декодерами.
Но в реальном мире это не так. В высокооптимизированном коде x86 редко используются сложные инструкции CISC, которые можно преобразовать во многие микрооперации. Фактически, большинство из них можно перевести только в одну микрооперацию.
Однако все эти простые инструкции x86 не помогают ни Intel, ни AMD. Потому что даже если эти 15-байтовые инструкции встречаются редко, декодеры должны уметь их обрабатывать. Это порождает сложность, из-за которой AMD и Intel и не могут добавлять дополнительные декодеры.
Но ядра AMD Zen3 по-прежнему быстрее, не так ли?
Насколько я помню из тестов производительности, новейшие ядра процессоров AMD, называемые Zen3, немного быстрее ядер Firestorm. Но вот что интересно: это происходит только потому, что ядра Zen3 работают на частоте 5 ГГц. Ядра Firestorm работают на частоте 3.2 ГГц. Zen3 едва обогнал Firestorm несмотря на то, что его тактовая частота почти на 60% выше.
Так почему же Apple не увеличивает и тактовую частоту? Потому что более высокая тактовая частота нагревает чипы. Это один из ключевых аргументов Apple. Их компьютеры — в отличие от предложений Intel и AMD — почти не нуждаются в охлаждении.
По сути, можно сказать, что ядра Firestorm действительно превосходят ядра Zen3. Zen3 удается оставаться в игре только за счет того, что он потребляет намного больше тока и становится намного горячее. То, что Apple просто предпочитает не делать.
Если Apple хочет более высокую производительность, они просто добавят больше ядер. Это позволяет им оставаться при малом потреблении энергии, обеспечивая при этом большую производительность.
Будущее
Похоже, AMD и Intel загнали себя в угол по двум направлениям:
- У них нет бизнес-модели, которая позволяла бы легко разрабатывать гетерогенные вычислители и дизайн SoC.
- Их устаревший набор инструкций CISC для x86 преследует их, затрудняя улучшение производительности OoO.
Это не означает, что игра окончена. Они могут увеличить тактовую частоту и использовать большее охлаждение, добавить больше ядер, увеличить объем кэша процессора и т.д. Но обе компании находятся в невыгодном положении. Intel находится в наихудшей ситуации, поскольку их ядра уже сильно уступают Firestorm, и у них слабые графические процессоры для интеграции с SoC-решением.
Проблема с добавлением большего количества ядер заключается в том, что для типичных рабочих нагрузок настольных компьютеров вы получаете убывающую отдачу от слишком большого количества ядер. Конечно, много ядер отлично подходят для серверов.
Однако на этом поле играют такие компании, как Amazon и Ampere, атакуют грандов монструозными процессорами со 128 ядрами. Это похоже на борьбу на западном и восточном фронте одновременно.
Но, к счастью для AMD и Intel, Apple не продает свои чипы на рынке. Таким образом, пользователям ПК просто придется мириться с тем, что они предлагают. Пользователи ПК могут покинуть тонущий корабль, но это медленный процесс. Вы не сразу покидаете платформу, в которую вложили большие средства.
Но молодые профессионалы, у которых есть деньги, которые можно сжечь без слишком глубоких вложений в какую-либо платформу, могут все чаще обращаться к Apple в будущем, укрепляя позиции компании на рынке премиум-класса и, следовательно, свою долю в общей прибыли на рынке ПК.
-
Видео и подкасты для разработчиков1 месяц назад
Lua – идеальный встраиваемый язык
-
Новости1 месяц назад
Poolside, занимающийся ИИ-программированием, привлек $500 млн
-
Новости1 месяц назад
Видео и подкасты о мобильной разработке 2024.40
-
Новости1 месяц назад
Видео и подкасты о мобильной разработке 2024.41