Организация процессора - PullRequest
0 голосов
/ 25 марта 2020

Я изучил следующие три типа организации ЦП: -

  1. Организация с одним аккумулятором
  2. Организация общего регистра
  3. Организация стека

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

Я хочу знать, используются ли наши современные и обычные компьютеры [например, ноутбуки, мобильные телефоны] в сочетании особенности?

И какой организацией арифметические операции c выполняются на этих обычных и современных компьютерах?

Пожалуйста, помогите мне действительно хотеть знать об этом.

1 Ответ

1 голос
/ 25 марта 2020

Практически каждый основной ISA является машиной регистрации.

У стековых и накопительных машин могут быть меньшие инструкции (более неявные, меньше явных операндов), но это не стоит затрат на дополнительные загрузка / сохранение данных инструкции. Даже при наличии кеша задержка загрузки и пересылки в хранилище для доступа к адресу памяти, выбранному регистром указателя, намного больше задержки (например, от 4 до 5 циклов), чем простое чтение регистра, номер регистра которого непосредственно закодирован в инструкции.

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


Некоторые старые 8-битные микро, такие как 6502 или 8080, могут считаться накопительной машиной, но у них есть некоторые другие регистры, например, для хранения указателя. Инструкции для этих ISA имеют только 1 явный операнд, а другой неявный в соответствии с кодом операции. Как ORA src это ORA в регистр A (аккумулятор). Но эти ISA не современные.

Если под "обычными компьютерами", такими как ноутбуки, вы имеете в виду основной x86, см. Какой тип адресной инструкции имеет процессор x86? . Полный набор инструкций см. В https://www.felixcloutier.com/x86/, где приведен фрагмент руководства Intel, в котором перечислены все поддерживаемые им инструкции. Он имеет 16 целочисленных регистров общего назначения (в 64-битном режиме) и 16 регистров FP / SIMD-векторов. (И унаследованный FPU x87, который интересно использует стек регистров).


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

Но на самом деле я думаю, что это просто вопрос об операндах инструкций, в этом случае все просто: почти все представляет собой 2-х или 3-х операндовый регистр, кроме устаревшего x86 FPU x87, который представляет собой архитектуру стека регистров.


Современные ISA в общем имеют инструкции для всех базовых c целочисленных побитовых сдвигов (и иногда вращаются), и целое число + - * / (и остаток от деления). Также обычно используется аппаратное обеспечение bit-scan , часто popcount . Некоторые имеют бит-реверс и / или байт-инверс, например, x86 bswap или ARM rbit / rev. Большинство ISA эффективно поддерживают арифметику с расширенной точностью c с помощью инструкций добавления с переносом и подзадачи, а также часто увеличивающегося множителя, например 64-разрядных входных данных => 128-разрядного продукта.

в качестве бюджетов транзисторов увеличились, если у вас есть специальные блоки выполнения, которые простаивают большую часть времени; Плотности транзисторов тока требуют, чтобы значительная часть площади d ie была «темным кремнием» в любой момент времени, чтобы не таять.

Более интересные комбинации сдвига / вращения / маскирования иногда встречаются в одной инструкции, как инструкции вставки / извлечения битового поля в некоторых ISA. PowerP C здесь особенно хорош, с такими инструкциями, как rlwinm, которые вращают регистр, оставленный мгновенным, и маскируют его, чтобы очистить биты, кроме как между двумя позициями, указанными двумя другими немедленными. Или другой вариант может вставить это битовое поле в другой регистр в произвольной позиции вместо извлечения в произвольную позицию в нулевом регистре.

Большинство вещей, для которых Rust имеет встроенные функции с примитивными целочисленными типами, такими как i32 поддерживается довольно напрямую по крайней мере некоторыми ISA, хотя AFAIK не целое число pow. (Rust хорош, как это, в отличие от некоторых языков, таких как C и C ++, которые отказываются переносить современные функции процессора. Целочисленное абсолютное значение встречается редко, хотя оно может быть выполнено без ветвлений только в нескольких инструкциях на большинстве ISA (вероятно, поэтому они не предоставляют инструкции для него). Поддержка насыщающей целочисленной арифметики c также редко sh вне DSP. На x86 он доступен только для некоторых SIMD-целых размеров.
На большинстве ISA добавьте / sub / mul просто обтекание, урезав результат до фиксированной ширины регистра. (С выносом (опционально) ввода в бит флага, если он есть). У большинства ISA есть способы проверить переполнение со знаком после факта.

x86 с BMI2 даже имеет pext / pdep для bit pack / unpack в соответствии с маской. https://www.felixcloutier.com/x86/PDEP.html и посмотрите AVX2, каков наиболее эффективный способ упаковки влево на основе маски? для варианта использования.

x86 также имеет встроенный - в истинном (не псевдо) RNG, через rdrand / rdseed.

x86 с AVX (для vmaskmov) и особенно AVX512 (маскировка для чего угодно) имеет поддержку маскируемых нагрузок и даже хранилищ, которые условно не на самом деле хранят, согласно маске в другом векторном регистре. ARM может сделать нечто подобное для скаляра с предикатными инструкциями, которые выполняются как NOP, если предикат (условие флага) имеет значение false. Обычно вам нужно выполнить ветвление, если вам, возможно, не нужно хранить.

ISA с SIMD-тасовками, которые получают свой операнд управления из другого вектора, могут использовать их для выполнения, например, 16-кратного 4-битного поиска LUT параллельно с вектором 16 байт. Это может быть использовано, например, для векторизации попконта или для других целей, таких как векторизация умножения поля Галуа. Или перевести целое число 0,55 в соответствующий шестнадцатеричный код ASCII di git: Как преобразовать двоичное целое число в шестнадцатеричную строку? показывает, как можно использовать SIMD для x86 для эффективной работы.

Другие операции SIMD включают SAD (сумма абсолютных разностей), интенсивно используемый при поиске движения в видеокодеках. Или против вектора всех нулей для горизонтальной суммы байтов без знака.

Некоторые ISA, такие как x86, поддерживают перенос без умножения. (Подобно обычному умножению, но с XOR вместо + для «добавления» сдвинутых частичных произведений.)


Конечно, большинство современных ISA имеют FPU, который может выполнять все IEEE-основы c операции с требуемой ошибкой <= 0.5ulp: + - * / и sqrt. И часто FMA. </p>

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

...