LINUX.ORG.RU

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

Deleted
()
Ответ на: комментарий от ymuv

Большая структура находится где-нибудь в памяти. Функции передается указатель на нее любым способом.

Deleted
()

примерные времена копирования:

регистр-регистр 1 такт

регистр-стек (на самом деле первый кеш) 4 такта

P.S. Скорее всего ты либо не решаешь какой-либо практической задачи и вопрос чисто для удовлетворения любопытства, либо для этой задачи вопрос не имеет значения.

anonymous
()

К.О.: на регистровых машинах — в регистрах, на стековых — через стек.

buddhist ★★★★★
()
Ответ на: комментарий от ymuv

нужно передать большое число переменных

Хороший тон программирования не рекомендует передавать более шести переменных. А уж 6 регистров даже в куцем x86 есть.

большую структуру

Куча. В особо критичных случаях можно извратиться и засунуть ее-таки в регистры.

buddhist ★★★★★
()

Если функция сложная, то регистры всё равно придется сохранять в стек - тогда без разницы.

unsigned ★★★★
()

сделай мелку прогу да и затести

там суть в том - что регистры уже используються при выполнение программы
и чтобы записат ьв регистры параметры для вызова подпрограммы - надо данные в них кудато сохранить - когда как при стеке - этого нетребуеться

+ также - подпрограмма должна заболотиться о не повреждении данных в регистрах - push-ить их восстанавливать при возврате

и в современных конвеерных процессах - разницы еще меньше

ae1234 ★★
()

Linux по умолчанию передает параметры в syscall'ы через регистры, хотя BSD и Windows через стек. Малое количество регистров общего назначения считается одним из главных недостатков х86, впрочем в х86-64 количество регистров общего назначения довели до 16.

hippi90 ★★★★★
()
Ответ на: комментарий от AF

Так вроде самые быстрые кэши как раз на регистрах делаются? И кэш - это не «память» в обычном понимании: напрямую он недоступен, т. е. нельзя хранить «это в кэше, а это в ОП».

Kiborg ★★★
()
Ответ на: комментарий от AF

И ниче. Гопник штоле?

С точки зрения программы можно записать данные либо в ОЗУ, либо в регистр процессора. «Записать в кэш» нельзя, нет такой инструкции. Решение о том, что держать в кэше, принимает процессор. Поэтому под «памятью» понималась оперативная память, а не кэши процессора. А «регистровая память» - это конкретный тип ОЗУ, ускоренный регистрами.

Kiborg ★★★
()
Ответ на: комментарий от dikiy

я вот не понимаю, что мешает сделать с процессоре 1000 регистров, например?

Я думаю:
1. Цена.
2. Как эти все регистры в стек пихать?

ymuv ★★★★
() автор топика
Ответ на: комментарий от ymuv

я вот не понимаю, что мешает сделать с процессоре 1000 регистров, например?

Я думаю:

1. Цена.

что там дорогого? 64000 триггера чтоли?

2. Как эти все регистры в стек пихать?

зачем все? Достаточно при пихать по умолчанию 16, к примеру. А если указано отдельно, то пихать больше.

dikiy ★★☆☆☆
()
Ответ на: комментарий от Kiborg

С точки зрения программы можно записать данные либо в ОЗУ, либо в регистр процессора.

Только вот иногда запись/чтение проходит медленно, а иногда быстро.

«Записать в кэш» нельзя, нет такой инструкции.

Ну да, а как же туда данные попадают?

Поэтому под «памятью» понималась оперативная память, а не кэши процессора.

Значит при каждой команде push/pop кеш никак не задействуется?

AF ★★★
()
Ответ на: комментарий от AF

Ну да, а как же туда данные попадают?

Читай книжки по ассемблеру, но я уже написал: этим управляет не программа, а процессор. Заодно man ассоциативная память.

push-pop - это про стэк, а не про кэш. Вообще говоря никто не обязывает стэк находиться в кэше, так что есть вероятность что после pop стэк процесса будет вытеснен в процессе вычислений и переключений контекста из кэша в ОЗУ, и push будет ждать ответа от оперативки.

Kiborg ★★★
()
Ответ на: комментарий от Kiborg

Читай книжки по ассемблеру, но я уже написал: этим управляет не программа, а процессор.

man prefetch* не осилил? Алгоритмы аппаратной предвыборки по шаблону в школе не проходил?

Впрочем это я уже в сторону уклоняюсь. Начало то, про передачу аргументов. Так вот в средне статистической программе, которая больше хелло-ворлда, регистров под аргументы, локальные переменные, временные переменные и т д катастрофически не хватает. Ну что еще отсается компилеру, кроме как засовывать все это в стек? Вот и получается, что обращений к стеку много. А раз так, то и вероятность нахождения этих данных в кеше, повышается. А теперь повторю вопрос, насколько быстрее будет работать add eax, edx, чем add eax, [edx], при при условии, что данные находятся в кеше первого уровня?

AF ★★★
()
Ответ на: комментарий от AF

Данные значания памяти по любому не лежат в кеше инструкций L1. Если ты запрашиваешь память из юзерспейса то ты не запрашиваешь ее значение в кеше L1, а фактичести лезешь стачала в TLB потом в память. По поводу префетча - прифетчить вы можете инструкции которые работают с регистром, а не данные.

(поправте если я не прав)

anonymous
()
Ответ на: комментарий от AF

У нас сейчас спор про разные вещи :) И да, prefetch пока в школах не проходят (и это, в общем-то, правильно), но в универе это было.

Возможно, что быстрее будет ненамного, если данные действительно находятся в кэше. С этим я и не спорю, я лишь напомнил в комментарии, что программа не может влиять на то, попадут конкретные данные в кэш или нет, и поэтому под «регистровой памятью» кэш понимать нельзя. Ну и потом еще указал на то, что регистровая память - это именно тип оперативной памяти, которая ускорена регистрами.

Надеюсь, вопрос исчерпан? :)

Kiborg ★★★
()
Ответ на: комментарий от dikiy

я вот не понимаю, что мешает сделать с процессоре 1000 регистров, например?

Надо будет всё это добро адресовать как-то. Слишком длинные инструкции с регистровой адресацией выйдут, а их большая часть. Выиграем на освобождении шины от пересылки данных, проиграем на пересылке длинных инструкций.

anonymous
()
Ответ на: комментарий от dikiy

я вот не понимаю, что мешает сделать с процессоре 1000 регистров, например?

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

в CISC традиционно мало регистров общего назначения, в RISC много(до 128),

mantar
()
Ответ на: комментарий от hippi90

хотя BSD и Windows через стек

и на х86-64?

anonymous
()
Ответ на: комментарий от dikiy

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

XoFfiCEr ★★☆☆
()
Ответ на: комментарий от XoFfiCEr

Но ведь чтобы вызвать функцию нужно сначала освободить все регистры, (ЕМНИП pusha ), а потом заново заполнить их (popa), ведь время тоже будет тратится.

ymuv ★★★★
() автор топика
Ответ на: комментарий от ymuv

Это если они используются в функции, тогда да. А иначе нет надобности.

XoFfiCEr ★★☆☆
()
Ответ на: комментарий от Kiborg

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

А так, да не регистры.

AF ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.