P.S. Скорее всего ты либо не решаешь какой-либо практической задачи и вопрос чисто для удовлетворения любопытства, либо для этой задачи вопрос не имеет значения.
там суть в том - что регистры уже используються при выполнение программы и чтобы записат ьв регистры параметры для вызова подпрограммы - надо данные в них кудато сохранить - когда как при стеке - этого нетребуеться
+ также - подпрограмма должна заболотиться о не повреждении данных в регистрах - push-ить их восстанавливать при возврате
и в современных конвеерных процессах - разницы еще меньше
Linux по умолчанию передает параметры в syscall'ы через регистры, хотя BSD и Windows через стек. Малое количество регистров общего назначения считается одним из главных недостатков х86, впрочем в х86-64 количество регистров общего назначения довели до 16.
Так вроде самые быстрые кэши как раз на регистрах делаются? И кэш - это не «память» в обычном понимании: напрямую он недоступен, т. е. нельзя хранить «это в кэше, а это в ОП».
С точки зрения программы можно записать данные либо в ОЗУ, либо в регистр процессора. «Записать в кэш» нельзя, нет такой инструкции. Решение о том, что держать в кэше, принимает процессор. Поэтому под «памятью» понималась оперативная память, а не кэши процессора. А «регистровая память» - это конкретный тип ОЗУ, ускоренный регистрами.
Читай книжки по ассемблеру, но я уже написал: этим управляет не программа, а процессор. Заодно man ассоциативная память.
push-pop - это про стэк, а не про кэш. Вообще говоря никто не обязывает стэк находиться в кэше, так что есть вероятность что после pop стэк процесса будет вытеснен в процессе вычислений и переключений контекста из кэша в ОЗУ, и push будет ждать ответа от оперативки.
Читай книжки по ассемблеру, но я уже написал: этим управляет не программа, а процессор.
man prefetch* не осилил? Алгоритмы аппаратной предвыборки по шаблону в школе не проходил?
Впрочем это я уже в сторону уклоняюсь. Начало то, про передачу аргументов. Так вот в средне статистической программе, которая больше хелло-ворлда, регистров под аргументы, локальные переменные, временные переменные и т д катастрофически не хватает. Ну что еще отсается компилеру, кроме как засовывать все это в стек? Вот и получается, что обращений к стеку много. А раз так, то и вероятность нахождения этих данных в кеше, повышается.
А теперь повторю вопрос, насколько быстрее будет работать add eax, edx, чем add eax, [edx], при при условии, что данные находятся в кеше первого уровня?
Данные значания памяти по любому не лежат в кеше инструкций L1. Если ты запрашиваешь память из юзерспейса то ты не запрашиваешь ее значение в кеше L1, а фактичести лезешь стачала в TLB потом в память.
По поводу префетча - прифетчить вы можете инструкции которые работают с регистром, а не данные.
У нас сейчас спор про разные вещи :) И да, prefetch пока в школах не проходят (и это, в общем-то, правильно), но в универе это было.
Возможно, что быстрее будет ненамного, если данные действительно находятся в кэше. С этим я и не спорю, я лишь напомнил в комментарии, что программа не может влиять на то, попадут конкретные данные в кэш или нет, и поэтому под «регистровой памятью» кэш понимать нельзя. Ну и потом еще указал на то, что регистровая память - это именно тип оперативной памяти, которая ускорена регистрами.
я вот не понимаю, что мешает сделать с процессоре 1000 регистров, например?
Надо будет всё это добро адресовать как-то. Слишком длинные инструкции с регистровой адресацией выйдут, а их большая часть. Выиграем на освобождении шины от пересылки данных, проиграем на пересылке длинных инструкций.
я вот не понимаю, что мешает сделать с процессоре 1000 регистров, например?
регистры это то что зашифровано непосредственно в коде асемблерной команды а адрес в памяти это операнд к этой команде, обмен между регистром и памятью дорогой, между регистр-регистр дешевый
в CISC традиционно мало регистров общего назначения, в RISC много(до 128),
Но ведь чтобы вызвать функцию нужно сначала освободить все регистры, (ЕМНИП pusha ), а потом заново заполнить их (popa), ведь время тоже будет тратится.
Если нет отдельной команды процессора, то это еще не значит, что кеш недоступен. Смотри шире - обыкновенная команда, которая что-то читает из памяти, инициирует загрузку данных в кеш.