В данной статье рассматривается вариант дальнейшего развития линейки микропроцессоров семейства x86, для того чтобы и дальше продолжать конкурировать с ARM процессорами как по стоимости так и по энергопотреблению.
Предлагаемые решения позволят:
В 2 раза увеличить скорость обработки (до 2 операций на ядро в такт процессора)
Уменьшить сложность процессора в 2 раза
Уменьшить энергопотребление в 4 раза (по отношению с той же производительностью текущих процессоров)
Уменьшить количество контактов процессора в 10 раз
Создаст возможность масштабирования путем простого увеличения количества процессоров и блоков памяти
Как известно, будущее компьютерных систем за распараллеливанием потоков, но как мне кажется, развитие современных процессоров идет не в том направлении. Да можно запихивать в один чип все больше и больше процессоров, при этом все увеличивая и увеличивая количество контактов в слоте. 1700 контактов у последних моделей процессоров, ну это уже слишком много и как при этом можно увеличивать количество процессоров? Да у таких процессоров система охлаждения занимает огромное пространство, да и стоимость этих процессоров кусается. Поэтому и ARM процессоры начинают теснить x86.
Да понятно, так компании Intel и AMD зарабатывают деньги, вынуждая периодически менять процессоры на более новые. Но существует и другой вариант зарабатывания денег, сделать возможность легко увеличивать количество процессоров в работающей системе. Этому и будет посвящены дальнейшие предложения.
Итак, для уменьшения количества транзисторов в процессоре предлагается кардинальное изменение структуры работы процессора и его взаимодействия с памятью и внешними устройствами.
Узким местом современных процессоров семейства х86 является старая система команд и очень малое количество регистров общего назначения. Об этом мало кто задумывается, программисты пишут на языках высокого уровня, и какие при этом используются машинные команды и почему, их мало волнует. А на самом деле использование сложных видов адресации данных, связано с малым количеством регистров, поэтому та команда, которая могла бы выполнятся за 1 такт, выполняется за 4 и более. А увеличить количество регистров не позволяет старая система команд, от которой так просто не откажешься, на ней написано множество программ.
Предлагается следующее решение
Изменить систему команд на новую, но совместимость со старой обеспечить при помощи перекодировщика, который будет готовые исполняемые модули для старой системы команд, без перекомпиляции, перекодировать в новую.
Новая система команд.
Отказаться от переменной длины команды. Все машинные команды занимают 4 байта. Непосредственные данные используемые в командах будут размером 2 байта. Если необходимо использовать непосредственное данное большего размера, то используется две и более команды. На самом деле использование в командах непосредственных значений размером больше 2 байт очень небольшое, просто современная система команд, использует всегда 4 байта, даже если нужно делать смещение на 1.
Каждое ядро процессора одновременно обрабатывает сразу 4 машинные команды. Т.е. сразу обрабатывается блок размером 16 байт. На обработку каждого блока команд отводится 1 такт процессора. Что дает увеличение производительности более чем в 2 раза. (часть команд фоновые, поэтому только в 2 раза увеличение)
В каждом блоке не могут одновременно использоваться несколько одинаковых команд. За исключением самых простых и часто используемых. (Это позволит тому же АЛУ выполнять параллельно 4 команды, без усложнения схемы. Ведь они не повторяются, а для каждой команды есть свой вычислительный блок.)
Каждое ядро одновременно выполняет 8 потоков, после выполнения команды одного потока, происходит переключение на выполнение команды другого потока и так по кругу. Такой конвейер позволяет обеспечить быстродействие выполнения блока из 4 команд за один такт процессора. Переключение потоков происходит мгновенно, просто переключая страницы регистров.
А теперь опишем это поподробнее
Для чего нам нужен конвейер с одновременной обработкой нескольких потоков одним ядром? А это необходимо для того, что пока выполняется команды одного потока, в этот самый такт происходит подготовка операндов для команд другого потока, который будет выполняться следующим, и в этот же такт происходит сохранение результатов работы команд, которые обрабатывались тактом ранее.
На самом деле каждый блок команд обрабатывается 6 тактов, Но это относится к шести потокам. Поэтому суммарно быстродействие ядра будет 1 блок команд в такт. Хоть по факту каждый поток будет обрабатываться медленнее, но не забывайте, что процессор не выделяет потоку все время процессора, как правило, это какое то количество процентов. В нашем случае, так как сразу обрабатывается 8 потоков, то и переключать потоки нужно в 8 раз реже, выделяя в 8 раз больше времени. Так что по сути 1 такт - один блок команд и будет реальным показателем производительности.
Реальный прирост производительности будет еще выше, не забывайте, что за такт выполняется сразу 4 команды, да многие из них будут выполнять фоновые операции, которые просто ускоряют выполнение следующих команд, но в реальном коде очень много операций сложения, пересылки, сравнения, которые вполне можно делать параллельно основному алгоритму. Что такое фоновые операции опишем ниже.
Разберем такты конвейера подробнее
Такт – выбор следующего потока, у которого будет выполняться следующий блок команд. Проверяется достоверность используемых регистров, завершение длинных команд, и приоритетность.
Выборка входных данных из регистров указанных в командах блока в промежуточные регистры.
Выполнение операции – по такту происходит перенос подготовленных данных на входы соответствующих операциям вычислительных модулей.
Считывание результатов обработки из вычислительных модулей в промежуточные регистры.
Запись результатов из промежуточных регистров в регистры указанные в командах. Формирование команд на считывание и запись в память.
Вычисление реальных адресов памяти и формирование пакета на чтение или запись памяти.
Как видно из представленного списка этапов обработки каждого блока программ, на реальное исполнение отводится всего один такт, а остальные этапы используются для подготовки обрабатываемых данных и после обработки происходит сохранение полученных результатов.
Ответим сразу на возникающий вопрос, как можно одновременно выполнять по 4 операции при этом, не усложняя вычислительный механизм ядра? А очень просто. Для выполнения каждой из простых команд и так есть отдельный вычислительный блок, но сейчас каждый из этих блоков используется по очереди. Мы же предлагаем, разделить этот механизм на 4 отдельных, каждый из которых может выполнять только свою часть команд. Одни команды могут выполняться только в одном из этих блоков. Именно поэтому, в одном исполняемом блоке команд, нельзя одновременно выполнять несколько одинаковых команд. Кроме самых простых (пересылки между регистрами, загрузки регистров, сложения, сравнения).
Теперь давайте разберемся, с блоками команд, и как можно обычный алгоритм преобразовать в предлагаемый вариант.
Как упоминалось выше в процессоре семейства х86 очень мало регистров общего назначения. Поэтому во многих машинных командах используется сложная система адресации. В основном из за этого, выполнение некоторых машинных команд увеличивается с 1 до 4 и более тактов процессора.
Например команда, mov eax, [ebx+ecx*4+342]
Эта команда загружает регистр eax, содержимым памяти для получения адреса которой необходимо к содержимому регистра ebx прибавить содержимое регистра ecx умноженное на 4( сдвинутое на 2 бита влево) и к полученной сумме еще прибавить конкретное число 432.
Как вы понимаете, сама операция вроде простая, и могла бы быть выполнена в 1 цикл, но прежде чем ее выполнить, нужно получить адрес и дождаться результата считывания из памяти и только потом приступить к обработке следующей операции. Это все и будет делаться в фоновых командах предшествующих этой.
Современные процессоры, путем усложнения логики, пытаются как то оптимизировать и ускорить выполнение таких операций. От чего и происходит усложнение процессоров, что увеличивает их стоимость и энергопотребление. А отказаться от подобных видов адресации нет возможности, так как регистров в процессоре очень мало, а увеличить их количество не позволяем существующая система команд. Так что как ни крути, приходится использовать подобные виды адресации.
Как же новая система команд позволит решить эту проблему? Для этого и понадобилось увеличение количества регистров и возможности выполнения одновременно 4 команд. Первая команда в блоке и отрабатывает основную логику алгоритма. Остальные 3 выполняют вспомогательную функцию и называются фоновыми командами. Основная их функция во время исполнения предыдущих команд подготовить необходимые данные, так чтобы когда придет время исполнять операцию со сложной адресацией, все данные уже считаны из памяти и загружены в регистры.
Фоновые операции всегда выполняются за 1 такт и это операции сложения, сдвига, сравнения, загрузки регистров и т.д. Основные операции всегда работают только с данными находящимися в регистрах.
Поэтому и необходимо увеличить количество регистров в несколько раз. Так как в предлагаемой модели вообще не используется КЭШ память, как 1 так и 2 и 3 уровней, то увеличение количества регистров все равно существенно упростит структуру процессора, не говоря о том сколько еще логики задействовано в механизмах управления КЭШем и предсказания необходимых выборок, отсутствие которых тоже упрощает процессор.
Фоновые операции, по сути будут выполнять функцию программно управляемого КЭШа
Вместо того чтобы, при помощи дополнительной логики попытаться предугадать какие данные понадобятся процессору и поэтому запрашивая излишнее количество байт в КЭШ. Данная модель, заранее, на этапе перекодировки кода, вычисляет необходимые данные в строго в необходимых количествах, заранее считывает их в дополнительные регистры. При этом ускоряя обработку и упрощая процессор. Да, при этом тоже может быть, что считанные данные тоже не понадобятся, но это будет на порядки реже.
В нашем примере, в предыдущие команды перед этой добавляются фоновые. Сдвиг влево регистра ecx и помещение результата в новый регистр, загрузка числа 342 в свободный регистр. В следующие команды добавляем фоном сложение полученных элементов адреса. В результате к моменту выполнения данной операции уже будет необходимый адрес в памяти. И само данное будет заранее считано в один из дополнительных регистров. Выполнение данной команды сведется к простой пересылке из одного регистра в другой. И это позволит выполнять подобные операции за 1 такт вместо 4 в текущей модели.
Все эти преобразования обычного алгоритма в блочный, выполняет специальная программа перекодировки, которая при помощи программной подборки выбирает варианты наиболее быстрого выполнения данного алгоритма при помощи блочного механизма выполнения команд. Поэтому переучивать программистов не нужно.
Давайте теперь обсудим, как отсутствие КЭШа позволит процессору успевать считывать необходимые данные. А для этого вспоминаем наш конвейер, когда, по сути, блоки команд одного потока выполняются через 8 тактов. Поэтому если посылать запрос на считывание данных за 3 команды, то у нас есть 24 такта для их считывания. И даже если данные не успели, то конвейер просто переключится на выполнение другого потока. Да скорость выполнения данного потока замедлится, но общая производительность системы не изменится, и она сможет выделить данному потоку больший процент общего времени ядра. Кроме того, у потока пропустившего свою очередь из за неготовности данных, увеличивается приоритет, и как только будут получены данные, его блок будет отправлен на обработку.
Для отслеживания готовности необходимых для обработки данных, у каждого регистра есть специальный признак Достоверность. При формировании запроса на считывание данных из памяти в определенный регистр, у этого регистра устанавливается признак Недостоверности. Поэтому все команды, которые должны будут использовать данные из регистра, с таким признаком будут переключаться на следующий поток. Как только считанные данные будут записаны в этот регистр, то признак Недействительности будет снят и выполнение потока будет продолжено.
Все команды ветвления и переходов обязательно находятся 1 командой в блоке команд. Вне зависимости будет произведен переход или нет в блоке команд с командой ветвления, все фоновые команды выполняются обязательно.
У процессора так же добавляем еще один регистр флагов, и команды работы с ними. Таким образом, при множественном сравнении и переходах можно в 2 раза ускорить обработку. Команда сравнения может быть фоновой, поэтому для нее не нужно выделять отдельный такт процессора. Пока происходит переход предыдущего сравнения, в фоновом режиме происходит новое сравнение в другой регистр флагов, и в следующем такте можно так же делать ветвление. (ускорение обработки подобных участков кода в 2 раза).
Сложные команды, на вычисление которых нужно больше 1 такта, так же обязательно находятся 1 в блоке команд. Вычисления таких команд происходит по другому, чем вычисление коротких команд. Данные команды, становятся в очередь на исполнение для таких команд. Данный поток получает признак Ожидания и после этого происходит переключение потоков. Даже при выполнении сложных операций ядро процессора не приостанавливается, а продолжает выполнение других потоков.
Для выполнения сложных операций в процессоре будет общий на все 4 ядра механизм их выполнения. Так как такие команды используются редко, то это не будет замедлять общую работу процессора. Этот механизм имеет общую очередь и работает в своем ритме не зависимо от основного процессора. Выбирает очередную команду из очереди, выполняет ее и отправляет результат в выходную очередь. Из выходной очереди результаты заносятся в необходимые регистры, снимается признак Ожидания с потока, и его выполнение продолжается. Для выполнения разных сложных команд будут свои блоки, поэтому возможно, что одновременно выполняются несколько сложных команд каждая в своем блоке. Для более часто используемых сложных команд, возможно дублирование блоков выполнения.
Обсудим потоковый механизм работы с памятью и внешними устройствами. Еще одним очень важным элементом изменения работы процессора, есть принцип ее работы с памятью и внешними устройствами.
Предлагается следующий механизм
Все команды процессора работают только с содержимым регистров, исключение только для команд загрузки регистров и записи в память. Предполагается, что пока обрабатываются одни блоки команд, в фоновых командах этих блоков происходит загрузка данных, которые понадобятся в следующих командах.
Команда, загружающая некоторый регистр, формирует команду интерфейсу процессора считать определенный адрес и результат записать в такой то регистр. После этого данный регистр, куда будут записаны считанные данные, помечается признаком «недействительный». Все блоки команд, которые захотят использовать регистры с таки признаком, будут переключаться на другой поток, ожидая пока данные из памяти, не будут загружены в регистр.
Команды записи в память, так же не ждут завершения записи данных в память. Просто формируют команду интерфейсу записать такие то данные, по такому то адресу, и переходят к обработке следующего блока команд.
Реализация цепочечных команд с префиксом повторения, так же меняется, для их выполнения используется несколько регистров, которые будут использоваться по кругу, и сразу формируется несколько команд на считывание или запись данных. Поэтому продвижение по цепочке будет происходить по мере заполнения регистров, т.е. как у регистров будет сниматься признак недействительности.
Еще одним слабым местом современных процессоров х86 это их шина подключения. (1700 контактов ну это «слишком много»), что сильно усложняет увеличение количества процессоров в компьютере. Этому способствует использование КЭШ памяти, так как использование нескольких процессоров в разных чипах сильно усложняет синхронизацию их КЭШ памяти, заставляя производителей впихивать в один корпус все больше и больше ядер. Так как мы не используем КЭШ, то можем увеличивать количество чипов процессоров в одном компьютере без особых сложностей. Поэтому попытаемся решить проблему количества контактов кардинально.
Изменяем шину подключения процессора, переходим к пакетной передаче данных по шине.
Оставляем минимальное количество контактов процессора.
В предлагаемом варианте процессор может иметь от 2 до 4 двунаправленных универсальных интерфейса. Каждый такой интерфейс содержит примерно 24 контакта. Итого: 24*4+24=120 24 на всякое питание прерывание и т.д. Оставляем максимальное количество контактов процессора 120. Это больше чем в 10 раз уменьшает их количество. И это должно работать не хуже, а возможно даже и лучше.
Каждый из 4 интерфейсов микропроцессора состоит из двух независимых каналов передачи пакетов данных. Один канал на прием, другой на передачу. Они оба одинаковые и работают совершенно не зависимо друг от друга.
Каждый канал содержит: 8 информационных контактов (1 байт), и 4 служебных.
Служебные сигналы:
Запрос на передачу, выставляется в 1 когда у передающей стороны есть что передать.
Готов принимать, выставляется приемной стороной, в ответ на запрос на передачу, если приемная сторона готова принять сразу весь пакет байт.
Происходит передача, выставляется в 1 передающей стороной, когда начинается передача.
Тактовый сигнал, передается передающей стороной. Может передаваться постоянно или только когда происходит передача данных. Если соединяются блоки вычислительной системы, имеющие разную максимальную частоту работы, то тактовый сигнал выдает тот блок, имеющий меньшую максимальную частоту.
Переход от 0 к 1 тактового сигнала показывает приемной стороне, что на информационных шинах выставлен очередной байт пакета данных.
Итак, для передачи данных в одном направлении нам необходимо 12 контактов. В обратном столько же.
Уменьшение количества контактов процессора очень важно для возможности масштабирования. Если необходимо увеличить производительность компьютера, то просто покупается еще один такой же процессор и блок памяти и подсоединяется к уже имеющемуся. (Так ведь тоже можно зарабатывать деньги, это обращение к производителям процессоров.)
Немного о блоках памяти
Размер блока памяти нужно ограничить не более 4 Гбайт, если нужно больше ставим несколько блоков. Каждый блок памяти содержит от 1 до 4 точно таких же интерфейсов как у процессора и они могут подключаться друг к другу напрямую просто соединив соответствующие контакты. Один и тот же блок памяти может подключаться к одному процессору одним или несколькими интерфейсами. Подключение сразу несколькими увеличивает пропускную способность канала. Так же блок памяти может каждым своим интерфейсом подключаться к разным процессорам, обеспечивая каждому из процессоров совместный доступ к общей памяти. При этом пропускная способность каждого канала независима друг от друга. Да может, конечно возникнуть задержка, если несколько процессоров будут одновременно работать с одним и тем же блоком памяти, но это уже не проблема узости канала, а проблема операционной системы, чтобы она учитывала размещение обрабатываемой информации в разных блоках памяти.
Кроме процессоров, блоков памяти в вычислительную систему входят мосты, специальный чип с 4 такими же интерфейсами. Его задача перенаправлять поток с одного входа на 3 возможных выхода и то же самое в обратном направлении. При этом задержка будет минимальная, всего 2 такта работы канала. Т.е. когда от процессора будет передаваться 3 байт пакета данных, уже 1 будет передаваться на соответствующем выходе моста.
Для работы мостов в пакет передаваемых данных добавляются еще байт адреса. Первый байт пакета это байт адреса. По первых двум битам этого байта определяется необходимый маршрут передачи данных. При каждом проходе моста этот байт сдвигается на 2 бита. Таким образом, при помощи таких мостов можно создать вычислительную систему, содержащую до 256 элементов. Т.е. проходя до 4 мостов туда и обратно.
При непосредственном соединении интерфейсов без мостов, специальным контактом интерфейса отключается механизм включения в пакет передаваемых данных байтов маршрута.
Вообще то, компьютер в новой концепции, вообще не нуждается в материнской плате. В самом простом исполнении это алюминиевый лист, к которому прикручены 4 чипа. Лист кроме опоры, так же является и теплоотводом, поэтому не нужны никакие куллеры, а так же задней крышкой экрана ноутбука.
4 чипа это процессор с присоединенными к нему блоком памяти, видео карта и блок подключения внешних устройств. Блок подключения внешних устройств, преобразует новый интерфейс в стандартные интерфейсы внешних устройств. И может представлять одну или несколько небольших плат с разъемами внешних устройств. Так что менять внешние устройства под новый формат шины не нужно, просто небольшой чип адаптера.
Если необходимо увеличить производительность, то добавляем в систему новый процессор, блок памяти и мост и заново компонуем все элементы, чтобы каждый процессор имел возможность передавать и получать обратно пакеты к любому элементу системы.
Кроме того, данный интерфейс позволяет увеличивать расстояние между элементами компьютера. Так как оба интерфейса приемный и передающий работают независимо, то скорость распространения сигнала не критична. Если необходимо разместить отдельные элементы вычислительной системы на большие расстояния, когда уже могут влиять внешние помехи на передачу сигнала. Для этого можно использовать оптоволоконные кабели. Пучок из 24 оптовых волокон не намного будет толще чем кабель идущий к монитору компьютера. Таким образом, можно соединять в одну вычислительную систему несколько процессоров находящихся в разных корпусах, или даже в разных комнатах. Оптоволоконное соединение будет так же выполнять и гальваническую развязку разных элементов системы.
Для подключения оптоволокна так же стандартный переходник, в котором находятся светодиоды и фотодиоды ничего сложного и дорогого. Просто с одной стороны светодиод переводит сигнал на контакте в свет, а с другой стороны свет фотодиод переводит обратно из света в сигнал на контакте. Небольшая при этом задержка не влияет на общую скорость работы системы.
Итак, чтобы при помощи таких узких интерфейсов (8 бит вместо 8 байт)обеспечить необходимую пропускную способность необходимо максимально увеличить скорость передачи шины процессора. И это вполне можно сделать. Так как у нас уже нет общей шины данных, к которой могут подключаться различное количество устройств, и нет шин с двунаправленными каналами передачи данных. Расстояния, на которые передается сигнал в пределах нескольких см, то скорость передачи можно сделать максимальной, на уровне внутренней частоты процессора.
При частоте шины 4 Ггц пропускная возможность канала составляет примерно 2 Гбайт в секунду в каждом направлении (учитывая, что часть передаваемой информации будет служебной). Так что в обоих 4 Гбайта в секунду. С учетом возможности подключения одновременно до 3 каналов, получаем 12 и это без всяких таймингов и задержек. Наши каналы работают в поточном режиме, а все необходимые задержки при считывании будет учитывать контроллер памяти. Поэтому не стоит полагать, что заявленные скорости обмена у современных блоков памяти в реальности могут быть выполнены. (это просто умноженная частота шины на ее ширину).
Кроме того кэш постоянно считывает избыточно лишнюю информацию, пытаясь оптимизировать доступ к памяти, и как минимум половина из этого по сути не будет использована.
А теперь учтем, что при увеличении количества процессоров, у каждого процессора свой блок памяти, и основная часть обмена с памятью должна быть организована именно у каждого процессора к своему блоку памяти, это еще позволяет кратно увеличить пропускную возможность обмена с памятью.
При этом себестоимость двух не очень сложных процессоров, гораздо ниже, чем у одного с накрученным количеством ядер у которого пропускная способность все равно остается ограниченной (это и заставляет производителей увеличивать количество контактов процессора).
Кроме того, для оптимизации работы процессора со стеком, возможно разместить стек внутри процессора, хотя бы на небольшое количество данных, с автоматическими функциями подгрузки и переноса стека в основную память. Например, как только отведенный под стек участок памяти процессора будет заполняться, то часть данных из стека будет переписываться в основную память, и наоборот, по мере освобождения стека внутри процессора будут формироваться команды подгрузить стек из основной памяти. Это позволит, когда придет очередь извлекать данные из стека, то они уже будут внутри процессора.
Опишем немного новую систему команд
Почему для каждой команды отводится 4 байта? Во первых, в 2 байта много не помещается, во вторых у некоторых команд появляется дополнительный третий операнд регистр результата, чтобы не портить исходные данные во время фоновых операций. При увеличении количества регистров до 256 на указание номера каждого необходим 1 байт. Так и получается, что меньше 4 байт на команду не выходит. А делать переменное количество байт в команде будет усложнять блочную обработку команд.
Да, это возможно увеличит общий размер новых исполняемых модулей, но не намного. У текущей системы команд, тоже есть своя избыточность, за счет которой возможно будет скомпенсировать величину увеличения кода. (например, в командах с адресами где есть смещение, даже если нужно добавить 1 добавляется 4 байта). Кроме того, увеличение количества регистров, позволит больше переменных держать в регистрах, а адрес регистра 1 байт, а адрес переменной в памяти это как минимум 5 байт. Так что увеличение кода будет не сильно большим.
Новая система команд, позволит добавить новые команды, и возможность условного выполнения блоков команд, что есть в ARM процессорах. При этом условность выполнения можно реализовать не на уровне программирования, а на уровне перекодировки в блочный формат. Там где в коде переход всего в пределах нескольких команд, команды перехода будут заменены блоками условного выполнения. (при выполнении условия блок выполняется, не выполняется просто пропускается)
Некоторые команды, которые не удается выполнить за один такт процессора, можно разбить на несколько микроопераций. И это тоже делать не на уровне программирования, а на уровне перекодировки. Например, операция сдвига на возможные 63 бита. Для ее выполнения необходимо для 6 битов количества сдвигаемых бит сделать ветвление. Т.е. входной сигнал должен пройти как минимум 12 логических блоков. При большой частоте процессора, это может быть препятствием. Поэтому такую команду можно разбить на 2 первая будет делать сдвиг, учитывая старшие 3 бита, а вторая младшие 3 бита. Таким образом, это позволит большинству команд выполняться в обычном режиме, не передавая их в конвейер для сложных команд.
Или наоборот, разбивка команд требующих более длительного выполнения на микрокоманды, позволит увеличить общую частоту процессора. Да некоторые команды, будут выполняться дольше, но зато общая производительность ядра существенно увеличиться. При этом наличие микрокоманд, ни как не увеличивает сложность самого процессора, для него это обычные команды.
В более простых процессорах, возможно, использовать один вычислительный блок на два ядра. Путем понижения тактовой частоты процессора до 2,5 Мгц, а вычислитель наоборот разгоняем до 5. Тогда он сможет за 1 такт обработать и операцию с одного ядра и с другого.
Итак, новая система команд, дает поле для дальнейших усовершенствований. Не забывая, что увеличение числа регистров, позволит существенно оптимизировать код программ, которые уже будут писаться на новых компиляторах. И там где сейчас идет обращение к памяти, в новом варианте будет использование регистров.
Итак, подведем итоги, что мы получим в результате
Процессор, имеющий 4 ядра, каждое из которых параллельно выполняет 8 потоков. Переключение между потоками в ядре не вызывает задержек в работе, а наоборот позволяем исполнительному механизму выполнять очередной блок команд, а в это время происходит заполнение регистров для других потоков.
Таким образом, ядро работает постоянно и без задержек. Кроме того, в каждом ядре выполняются кроме основной операции, еще и до 3 фоновых. Фоновые операции позволяют заранее в предыдущих командах подготовить данные и адреса для выполнения операций со сложной адресацией, которые ранее выполнялись за 4 такта, теперь будут выполнятся за 1. Что существенно ускоряет работу каждого ядра.
Сложные команды выполняются в одном на процессор АЛУ. АЛУ имеет отдельные блоки для выполнения разных команд, поэтому в нем могут одновременно выполняться разные операции от любого из активных потоков процессора. Вероятность выполнения одновременно несколькими потоками одинаковых команд не сильно велика, поэтому задержки должны быть минимальными. При этом, поток не ожидает результатов работы сложных команд, он просто отправил команду на выполнение и пометил регистр результата как недействительный, и после этого может начинать обрабатывать следующий блок команд.
Так же мы убрали из процессора КЭШ и все алгоритмы, связанные с его работой, алгоритмы предсказания и оптимизации, которые должны существенно упростить схему процессора и уменьшить его энергопотребление. А в результате и его стоимость.
Изменение шины процессора и уменьшение ее в 10 раз, позволит облегчить возможность масштабирования компьютера, путем простого добавления новых процессоров и блоков памяти. При этом, эти процессоры могут быть с разной внутренней частотой, но потоковый интерфейс позволяет использовать в одной системе блоки с разной частотой. Для этого тактовый сигнал в интерфейс выдает тот блок, у которого она минимальная.
Насчет программного обеспечения и программистов. В этой области вообще ничего не нужно менять. Программы так же как писались, так и будут писаться. Возможно нужно будет менять компиляторы на новую систему команд, для того чтобы по максимуму использовать появившиеся возможности новой системы команд. По умолчанию, старые программы просто автоматически будут перекодироваться из старой системы команд в новую.
Так что как ни крути, кругом одни плюсы. Данные изменения позволят процессорам х86 и дальше успешно конкурировать с ARM процессорами.
Ну и в конце, обращение к тем, кто уже готов писать гневные комментарии, «мол у нас и так все хорошо работает и самое главное лучше чем у соседа, поэтому ничего менять не надо».
Основная цель этой статьи, как процессорам семейства х86 и дальше продолжать конкурировать с ARM процессорами. С каждым годом все больше вокруг нас появляется устройств с процессорами, и это не стационарный компьютер или ноутбук, они гораздо меньше и автономность для них очень важна. И туда не засунешь процессор с 1700 ножками, вентиляторов и чемоданом батареек.
Стоит только придумать толковый перекодировщик программ в систему команд ARM, и производители ноутбуков переключатся на них, так как они дешевле, и к ним аккумуляторы можно попроще. А значит товар будет дешевле и его будут брать больше. А потом и производители программного обеспечения и игр начнут переключаться на новый растущий рынок. И все рынок утерян, и в последствии, после перехода программного обеспечения на новую платформу, потребление само схлопнется. Кто захочет покупать компьютер дорогой, да еще и к которому не подходят новые программы и игры.
Так что хочешь, не хочешь, нужно что то менять и как можно раньше.
Александр Бобров
декабрь 2022г.
P.S.
Если у кого есть возможность и главное желание, переслать и по желанию перевести на английский язык данную статью, представителям компаний Intel и АМД, очень интересно их мнение по этому поводу.
И да, если она им покажется интересной, на авторские выплаты не претендую, а вот от вознаграждения за идею не откажусь.
Комментарии (41)
ProFfeSsoRr
10.01.2023 01:44+4Один вопрос: почему вы считаете, что так будет лучше, и что инженеры Intel до этого не додумались и уже не проверили это всё? Насколько я знаю, передовые инженеры в разработке процессоров знают или английский, или китайский, даже если их неродной язык ;)
Anton_Menshov
10.01.2023 01:56+7Влажные фантазии.
Очень советую учить английский и сначала много-много читать и задавать вопросов себе, интернету и коллегам.
pharo
10.01.2023 02:00А на самом деле использование сложных видов адресации данных, связано с малым количеством регистров, поэтому та команда, которая могла бы выполнятся за 1 такт, выполняется за 4 и более
Банальность:
Если не понимать, что много тормозов проистекает не в процессоре, а в реализованной программе, то и выводы по увеличению «производительности» не будут правильно сделаны.
P.S. Есть/были процессоры архитектуры MISC (0-адресная система команд) подобие внутреннего кода использованного в Java, C# так вот они вполне неплохо конкурировали с регистровыми RISC процессорами в тесте CoreMark
но т.к. и их код команд смогли с помощью JIT, AOT хорошо перекладывать на регистры, то поэтому они особо и не сделали своей погоды, а создавать инструментальную экосистему ещё и для них мало кому улыбалось. :)
Lev3250
10.01.2023 02:04+2Как это повлияет на транзисторный бюджет? Например автоматы на троичной логике могли бы вытеснить двоичную по скорости вычисления задач, но при переносе на физику двоичная по совокупности факторов побеждает. Может тут тоже не настолько всё на поверхности, если учитывать частности?
Kremleb0t
10.01.2023 02:22+5Если у кого есть возможность и главное желание, переслать и по желанию перевести на английский язык данную статью, представителям компаний Intel и АМД, очень интересно их мнение по этому поводу.
И да, если она им покажется интересной, на авторские выплаты не претендую, а вот от вознаграждения за идею не откажусь.
А ваши знания о проектировании процессоров разве не позволяют вам достойно зарабатывать? Какой размер вознаграждения вас-бы устроил?
pharo
10.01.2023 02:32+9Вообще то, компьютер в новой концепции, вообще не нуждается в материнской плате. В самом простом исполнении это алюминиевый лист, к которому прикручены 4 чипа.
Шедеврально! :)pavel_kudinov
10.01.2023 02:44+3У ней внутре неонка (c)
dimao79
10.01.2023 05:10+5Не, про неонку это чуть дальше:
... стандартный переходник, в котором находятся светодиоды и фотодиоды ничего сложного и дорогого. Просто с одной стороны светодиод переводит сигнал на контакте в свет, а с другой стороны свет фотодиод переводит обратно из света в сигнал на контакте.
При частоте шины 4 Ггц ...
Ну очень просто перевести электричество в свет и свет в электричество на четырех гигагерцах, элементарщина же, пффф. Несколько сложнее четырех микросхем на алюминиевом листе, но тоже ничего сложного. Осталось прикрутить на тот же лист дорожки и все Интел, ты банкрот!
pavel_kudinov
10.01.2023 02:36+1Для чего нам нужен конвейер с одновременной обработкой нескольких потоков одним ядром? А это необходимо для того, что пока выполняется команды одного потока, в этот самый такт происходит подготовка операндов для команд другого потока, который будет выполняться следующим, и в этот же такт происходит сохранение результатов работы команд, которые обрабатывались тактом ранее.
это сейчас примерно так и работает в современных процессорах
pavel_kudinov
10.01.2023 02:43+4Каждое ядро процессора одновременно обрабатывает сразу 4 машинные команды. Т.е. сразу обрабатывается блок размером 16 байт. На обработку каждого блока команд отводится 1 такт процессора. Что дает увеличение производительности более чем в 2 раза. (часть команд фоновые, поэтому только в 2 раза увеличение)
В каждом блоке не могут одновременно использоваться несколько одинаковых команд. За исключением самых простых и часто используемых. (Это позволит тому же АЛУ выполнять параллельно 4 команды, без усложнения схемы. Ведь они не повторяются, а для каждой команды есть свой вычислительный блок.)
Каждое ядро одновременно выполняет 8 потоков, после выполнения команды одного потока, происходит переключение на выполнение команды другого потока и так по кругу. Такой конвейер позволяет обеспечить быстродействие выполнения блока из 4 команд за один такт процессора. Переключение потоков происходит мгновенно, просто переключая страницы регистров.
эти ограничения превращают процессор в SIMD архитектуру, для которой нельзя будет писать полностью параллельный произвольный код. такие фокусы действительно дают очень мощное ускорение по сравнению с классическими процессорами, но по другой схеме - это называется SIMD GPGPU, по-простому "считать на видеокартах"
и там действительно x100 и даже x1000 производительность, только для такого процессора нужно особым образом организовывать данные и код (CUDA/OpenCL), поэтому эта архитектура ещё не заменила классические CPU (но nVidia активно топит в эту сторону)
просто так любой код ни под ваш вариант SIMD ни под правильный SIMD GPGPU не скомпилировать
p.s. не по наслышке, занимаюсь программированием видеокарт 10 лет
beeruser
10.01.2023 02:45+9Кринж (извините).
Походу автора заморозили где-то в конце 1970-х годов.
Узким местом современных процессоров семейства х86 является старая система команд и очень малое количество регистров общего назначения.
НЕ является. Система команд в современных OoO процессорах практически не имеет значения. Функционально, возможности х86 / arm / risc-v примерно равны.
Это только удобство для компилятора / программиста.
Команды перекодируются в МОП-ы, регистры переименовываются (и их сотни уже).
Внутри OoO процессоры х86 / arm работают одинаково (с высоты птичьего полёта).
Путем понижения тактовой частоты процессора до 2,5 Мгц, а вычислитель наоборот разгоняем до 5. Тогда он сможет за 1 такт обработать и операцию с одного ядра и с другого.
2,5МГц - достойная цель для 2022г. В Z80 уже было 3,5МГц.
Каждое ядро процессора одновременно обрабатывает сразу 4 машинные команды. Т.е. сразу обрабатывается блок размером 16 байт.
Процессоры х86, как и ARM, обрабатывают блок 32 байта.
Будучи в криокамере, вы наверное пропустили, но современные процессоры уже выполняют 6-10 команд за такт. А Эльбрус вообще 50 :)
В основном из за этого, выполнение некоторых машинных команд увеличивается с 1 до 4 и более тактов процессора.
Например команда, mov eax, [ebx+ecx*4+342]
Такая адресация вычисляется за такт начиная с 486.
1700 контактов у последних моделей процессоров, ну это уже слишком много и как при этом можно увеличивать количество процессоров?
Половина контактов это подводка питания.
https://en.wikichip.org/wiki/amd/packages/socket_am4#Pin_Map
В общем налицо полное непонимание вопроса, либо осознанный глум (искал тег "юмор").
В первом случае рекомендую написанное забыть и начать изучение вопроса с устройства простого DLX.
code07734
11.01.2023 03:02"CISC-овость" isa может ограничивать компилятор в оптимизациях. Для наглядности можно посоединять инструкции. Например пусть будет mul/add строго как одна целая 3-операндная операция и ещё добавим "фичу" - все операции работают только с памятью, регистры не доступны. Так можно долго играть пока внутрь процессора компилятор не переедет
beeruser
11.01.2023 06:26"CISC-овость" isa может ограничивать компилятор в оптимизациях
Я и написал "Это только удобство для компилятора / программиста."
В основном различия имеются в SIMD наборах, но не кардинальные.
Например пусть будет mul/add строго как одна целая 3-операндная операция
Это как раз базовая RISC операция, которая со скрипом попала в SIMD набор х86.
code07734
12.01.2023 19:40Вы наверно не так поняли
Я о том что
Isa НЕ только для удобства компилятора / программиста
Каждый раз когда говорят что ISA не имеет значения - мне непонятно в насколько широких рамках это утверждение считается истинным утверждающим
Вы же использовали слово "только" - значит считаете что ISA можно вообще любой сделать и при этом это никак не повлияет на количество необходимых оптимизаций для ISA с более сложными инструкциями?
Соответственно, в данном случае, я довожу ситуацию до абсурда
В примере с mul-add я имел ввиду не только добавить mul-add, но и убрать add и mul
То есть если убирать самые простые инструкции и добавлять более комплексные то появятся накладные расходы:
1.Раскладывание на мопы
2.Генерация бОльшего числа мопов потому что многие задачи требующие ряда простых инструкций могут неожиданно решаться за бОльшее число сложных инструкций. Как например сделать xor через умножение
3.БОльшее число мопов потребует элиминации большего ....числа мопов
Я однозначно много чего ещё не учёл
Но всё таки вы наверно имели ввиду что в среднем по больнице текущие ISA +- одинаковы и ухудшать их настолько явным образом точно не будут и в этом смысле ISA сейчас несёт малую роль
Cdracm
10.01.2023 02:57+1При увеличении количества регистров до 256 на указание номера каждого необходим 1 байт.
Кстати, а вы знаете, что в нынешних процессорах физических регистров уже больше этого?
(В Sunny Cove размер ROB=352: https://en.wikichip.org/wiki/intel/microarchitectures/sunny_cove )
ShadowTheAge
10.01.2023 03:01+4Поздравляю, вы изобрели хреновенький VLIW. Почитайте про его недостатки, и почему не взлетело. Ну а я просто пару пунктов:
Почему бы не пойти дальше и не оставить только одну команду, а операцию по подготовке данных оставим процессору. Он в железе это сможет реализовать быстрее и энергоэффективнее на несколько порядков. Вы думаете он там целый такт умножает число на 8 чтобы исполнить режим адресации "х*8"? Умножение числа на 8 (<< 3) в железе это вообще просто "проводочки перемапить", вряд ли такое будет хоть как то влиять на критический путь любой команды. Зачастую дополнительное время на исполнение более сложных команд вообще только за счет их размера и получается, а тут все команды гигантские.
А почему 4 субкоманды? И что будем делать когда возникнет нужда увеличить до 8? Программы то под 4 написаны. Сейчас есть такое что от нового cpu автоматически старые программы начинают работать чуть чуть быстрее, даже без поднятия тактовой частоты. А тут так не получится, под новый cpu все программы придется перекомпилировать, плюс как то еще интероп чтобы работал - из программы скомпилированной под 8 вызвать функцию (в другой библиотеке) скомпилированной под 4, и получить результат.
Когда все субкоманды предполагается менеджить программисту, на него перекладывается огромный головняк связанный с тем что данные которые мы уже начали считать для команды которая там будет через несколько операций, могли измениться. И компилятор очень часто не сможет просто доказать что эти два указателя никогда не будут ссылаться на одну область памяти например (чтобы начать вычисления над одним тогда как по второму вот вот произойдет запись). А у языков программирования есть модели памяти и прочие обязательства перед программистом. В такую модель команд будет просто не сделать нормальный (эффективный) компилятор с/с++, он будет просто постоянно вынужден прожигать циклы чтобы обеспечить корректность (завершать запись прежде чем начинать чтения для следующих команд). И опять же, в железе это сделать относительно просто, по крайней мере можно увидеть что мы поломали данные которые уже считали недавно и сбросить конвейер (начать заново), получить замедление в этом конкретном случае (в случае если произошел алиасинг), а в основном случае все будет хорошо запайплайнено.
Повторюсь, это все минусы VLIW архитектуры и причина почему она не взлетела.
Keeper9
10.01.2023 04:11+2от вознаграждения за идею не ототкажусь.
Идеи почти ничего не стоят. Ценится реализация идей, ценится вложенный труд.
Где ваша реализация?
DanilinS
10.01.2023 08:34+3Откуда тут реализация? У автора уровень знаний школьника 4 класса в году эдак 86. Автор вообще крайне слабо разбирается в элементарных вещах. А ты хочешь от него реализацию процессора на верилоге или VHDL.
Пусть автор напишет реализацию, прошьет в FPGA и выложит результат. И сразу будет все видно.
GospodinKolhoznik
10.01.2023 11:01-1Офтипик, но утомила это чушь про то, что идея ничего не стоит. Это говно-идея ничего не стоит, а годная идея стоит ого-го!
Посетила бы меня в 2010 году идея прикупить биткоинов, ух я бы сейчас жил!
Keeper9
10.01.2023 11:05+2Но не купили. Что и требовалось доказать.
GospodinKolhoznik
10.01.2023 11:12-1Так не пришла в голову идея. Потому и не купил. Пришла бы, точно купил, я примерно в те годы Кийосаки начитался и как раз искал во что бы такое проинвестировать некоторую сумму денег, чтобы оно через 10-20 лет стало стоить дороже.
doctorw
10.01.2023 14:47+1Купить - это уже реализация идеи, а сама идея не сильно много стоит.
GospodinKolhoznik
11.01.2023 10:05Почему вы думаете, что сама идея так мало стоит?
doctorw
11.01.2023 17:46Потому что как правило, без реализации идея не приносит пользы.
GospodinKolhoznik
12.01.2023 10:10Машина без бензина не поедет и пользы никакой не принесет. Значит ли это, что автомобиль с пустым топливным баком почти ничего не стоит?
doctorw
12.01.2023 22:18Зависит от окружения - если рядом есть бензин (реализация условно ничего не стоит), а если это пустыня на километры вокруг?
ValeriyPu
11.01.2023 14:23И откуда нам знать, что сам Александр Бобров изрек сие именно в декабре 2022? )
AquariusStar
10.01.2023 09:48+5«В 2 раза увеличить скорость обработки (до 2 операций на ядро в такт процессора)» Вообще-то все современные процессоры уже давно как выполняют несколько операций одновременно. Суперскалярность передаёт вам привет. И тем более, что Intel, что AMD имеет несколько конвейеров (многопоточность aka multithreading или фирменный Intel Hyper Threading).
«Уменьшить сложность процессора в 2 раза» Относительно чего? Если саму систему команд x86-64, то её невозможно упрощать в силу её природы. Если декодер команд, то получите процессор Atom или какой-нибудь древний 80386. Оставьте это дело матёрым разработчикам процессоров. Они знают все тонкости для наращивания производительности.
«Уменьшить энергопотребление в 4 раза (по отношению с той же производительностью текущих процессоров)» Попробуйте поспорить с физикой.
«Уменьшить количество контактов процессора в 10 раз» Чего, &№#%$? Предлагаете отказаться от периферии вообще? Мне, разработчику ПЛИС, видно, что даже 900 контактов микросхемы бывает мало. Потому что значительная часть контактов уходит на питание. Процессоры не исключение. Я и не говорю, что модули ОЗУ сжирают огромное количество контактов.
«Создаст возможность масштабирования путем простого увеличения количества процессоров и блоков памяти» Ну как-то все масштабируют, увеличивают. Но только те, кто реально делает процессоры, прекрасно понимает, что тупое масштабирование может оказаться вредным и приведёт к снижению производительности.
Почитал мельком оставшуюся часть статьи. Большая часть — это бред сивой кобылы. Остальная и так реализована в процессорах и давно работает.
В общем, советую вам изучить материалы по процессорам, в том числе и современным.
ValeriyPu
12.01.2023 10:40Похоже, кто то пытался стащить чужую идею просто )
И потому мы тут видим фарш из multi issue, optical interconnect, Heterogeneous grids и прочего, недоступного автору )
Armmaster
10.01.2023 15:02+4Автору статьи я бы посоветовал начать с данной книги:
Если у автора проблемы с английским, то можно данную книгу найти в русском переводе.
websnow
11.01.2023 14:251700 контактов у последних моделей процессоров, ну это уже слишком много
AMD Ryzen Threadripper со своими 4094 контактами от 2017 года, а также ivy Bridge EX со своими 2083 контактами от 2014 года не согласны с Вашим утверждением.
Wowa69
11.01.2023 16:14Тут все критикуют статью, но есть тут одна идея, над которой думал ещё лет 15 назад, и вроде ещё ни где не видел реализованной: Это 1) отказаться от кеша (он занимает много места на кристалле и потребляет энергию) и 2) одно ядро будет выполнять много потоков по мере того, как данные будут приходить из памяти. В результате каждый поток будет очень медленным, но количество потоков будет очень большое и канал работы с памятью будет полностью нагруженным, в чём возможно будет выгода. Но это будет довольно специфический процессор далеко не для всех задач, но в чём-то особенный.
beeruser
12.01.2023 20:09идея, над которой думал ещё лет 15 назад, и вроде ещё ни где не видел реализованной
одно ядро будет выполнять много потоков по мере того, как данные будут приходить из памяти
Поздравляю, вы изобрели GPU (а ещё раньше были векторные процессоры)
отказаться от кеша
Чтобы полностью убить всю производительность?
Представьте что 1000 ядер хочет прочитать байтик из внешней памяти одновременно, вместо того чтобы достать его из своей локальной памяти.
(он занимает много места на кристалле и потребляет энергию)
Любой блок занимает место на кристалле и потребляет энергию.
Кэш это не кнопка вкл/выкл.
Путём подбора параметров размер * Ассоциативность * физ. реализация ячейки достигается требуемый баланс.
Ранние GPU имели очень мало кэша (несколько кб на "ядро").
И им хватало (до поры до времени) - десятки / сотни потоков на "ядро" компенсировали латентность памяти, пока не наступила эра GPGPU.
BugM
Поделитесь своими регалиями в проектировании процессоров? Человек замахнувшийся на то чтобы советовать ведущим корпорациям наверно имеет множество достижений?
Гугл показывает странное https://www.google.com/search?q=Александр+Бобров
kosmonaFFFt
Напомнило.
В одной компании, где я работал, был проект. И было в том проекте некоторое количество интересных решений (на уровне отдавать в ответе сервиса всегда 200 ОК, а ошибку класть в поле error ответа, а если ответ успешный, то его класть в поле data, конечно же сериализовав его предварительно в строку). И когда я спросил у коллег, откуда это все взялось, мне ответили, что актер какой-то написал. Даже ссылку на статью про него скинули.
Corpsee
Если API сервиса не заявляется как REST, то нет никакой проблемы в том что сервис отвечает 200 и кладет ошибку в error. 200 - это статус транпортного уровня, а ошибка возникает на уровне сервиса. Так что зависит от контракта, "интересное" решение или нет.