Можем ли мы иметь компьютер только с регистрами в качестве памяти? - PullRequest
10 голосов
/ 26 сентября 2010

Регистры - самые быстрые воспоминания в компьютере. Так что, если мы хотим создать компьютер только с регистрами и даже без кэшей, возможно ли это? Я думаю даже о замене магнитных дисков на регистры, хотя они являются естественно изменчивыми воспоминаниями. Есть ли у нас энергонезависимые регистры для этого использования? Это стало бы так быстро! Мне просто интересно, могло ли это случиться или нет?

Ответы [ 10 ]

11 голосов
/ 04 октября 2010

Очень короткий ответ: Да, теоретически, вы можете, но на самом деле это не работает . Позвольте мне объяснить ...

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

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

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

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

Вас также может заинтересовать мой ответ на Сборка: почему мы беспокоимся о регистрах?

3 голосов
/ 26 сентября 2010

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

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

Однако этот тип реализации и взаимосвязи - это то, что занимает место в матрице на микропроцессоре. Когда это израсходовано, вы начинаете добавлять память для дополнительного хранилища.

Были архитектуры с дополнительными банками регистров. ( SPARC !)

2 голосов
/ 07 ноября 2010

Современные графические процессоры имеют около 5 МБ регистров и очень мало кэшей (по сравнению с процессорами). Так что да, возможно иметь процессор с большим количеством регистров.

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

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

2 голосов
/ 04 октября 2010

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

1 голос
/ 04 октября 2010

Большинство из этих ответов касаются вопроса, будет ли это практичным. Дэвид Джонстон также упоминает тот факт, что имя регистра должно упоминаться в каждой инструкции, которая к нему относится. В дополнение к этому, в большинстве современных наборов инструкций у команды всегда есть закодированные регистры операндов. Например. есть инструкция mov %eax, %ebx и инструкция mov %eax, %ecx. Может случиться так, что их двоичное представление выглядит так:

| mov | source reg | dest reg | 
|  2  |     3      |     3    |

и отличается только тем, что dest reg равно 3, а не 2 - но это также не может! (Я не проверял, как эти конкретные инструкции представлены в 386, но я вспоминаю, что в этом наборе команд есть примеры, которые легко разбиваются на подобные поля, и примеры, где их нет.)

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

Я не буду это доказывать, но я подозреваю, что для того, чтобы что-то приблизилось к полноте по Тьюрингу, вашим программам потребуется либо:

  • инструкции, которые адресуют регистры на основе значения в некотором другом регистре, например «Переместиться из регистра X в регистр Y, где X и Y обозначены значениями в регистрах 1 и 2.», или
  • самоизменяющийся код.

В школе у ​​нас был теоретический компьютер с 100 регистрами (плюс аккумулятор) и 10 инструкциями, каждая из которых представляла собой трехзначное десятичное число. Первая цифра указывает операцию (загрузка, сохранение, арифметика, переход, условный переход, остановка), а последние два регистра работают с ним. Для этого можно написать множество примеров программ, например, функцию факториала. Но вскоре стало очевидно, что статическая программа может работать только с фиксированным набором данных. Если вы хотите написать цикл для суммирования значений в списке, вам понадобится инструкция LOAD, которая указывает на разные входные регистры на каждой итерации. Это означало, что вы будете арифметически вычислять новый код для инструкции загрузки каждый раз и исправлять код непосредственно перед выполнением этой инструкции.

1 голос
/ 04 октября 2010

для каждого 32-битного регистра вам нужно как минимум 9x32 вентилей xor.это много ворот.

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

Допустим, у нас есть 10 регистров, мы делаем 10-линейную шину?значит у нас есть 10 шинных разъемов, которые подключаются к большей части системы?это очень сложно, теперь вы хотите, чтобы регистр что-то значил, верно?

давайте просто посчитаем, сколько басов нам нужно для 1 КБ данных?

1024 бит = 1024 * 9 * 32Ворота и 1024 линии баса в процессоре.

Мы знаем, что Intel работает с 30 нм для одного гейта.это 30 миллионов гейтсов, проблема с затворами более реданна, но как вы решите проблему с басами?

0 голосов
/ 09 октября 2015

Горячий от теоретической пластины оборудования ->

Если вам удастся связать каждую перестановку битов адреса с отдельными словами - тогда вы могли бы иметь систему регистров оперативной памяти. представьте, если вы используете nand для создания групп адресов. (другими словами, связать противоположный адрес с флопом). Нет, и вы выполнили адресацию только с помощью проводов + маленький выключатель not, который может быть катушкой соленоидного типа, которая не соответствует значению. затем все регистры поступают в один и тот же вывод - выводы контента. И только адрес, который был пройден, получит питание для выводов контента.

Simples.

0 голосов
/ 26 сентября 2010

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

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

0 голосов
/ 26 сентября 2010

Вам даже не нужны регистры - можно создать что-то вроде машины Тьюринга, которая принимает поток входного кода и данных и создает выходной поток.Это то, с чего начинали компьютеры.

0 голосов
/ 26 сентября 2010

Причина, по которой у вас так мало памяти регистров, в том, что она невероятно дорогая. Вот почему у нас есть иерархия памяти.

...