Часовой пояс: UTC + 3 часа




Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 82 • Страница 4 из 5<  1  2  3  4  5  >
  Версия для печати (полностью) Пред. тема | След. тема 
В случае проблем с отображением форума, отключите блокировщик рекламы
Автор Сообщение
 
Прилепленное (важное) сообщение

Member
Статус: Не в сети
Регистрация: 18.01.2007
Вот ссылка на мою беседу с программистом, одним из создателей игры СЯ (Andrey12345):
http://www.sukhoi.ru.sixxs.org/forum/sh ... 98&page=44 (и предыдущая пара страниц)

Мы здесь переходим на 64-разрядные ОС, а программисты (от кот., между прочим, зависит смысл этого перехода) сомневаются в эффективности 64-бит в принципе, особенно для игр.
Т.е. вплоть до того, что, например, те же игры не только не выиграют, а даже проиграют от такого перехода!

В общем, делимся своим мнением по этому вопросу.

П.с. Что касается меня, то я просто в недоумении...
____________________________________________________________________

Ray Adams
Цитата:
Ну если его код в 64 битном исполнении тормозит, то это не значит, что писать под 64 бита это плохо. ну не виджит человек в этом никакой для себя пользы, ну и пусть и дальше так не видит. 64 бита от этого не пострадают. Я сам программист и знаю, как часто просто из-за врождённой для каждого программера лени, нет никакой охоты переписывать что-то под новую платформу. И тем более оптимизировать. А уж консерватизм программистов это вообще притча и т.д.

Можно конечно тупо перекомпилировать, но такой в лоб подход не всегда принесёт пользу.
Можешь программеру показать Кризис. Что 64 , что 32 в принципе идут одинаково в плане скорости! Но! При таких обьемах текстур и всего остального 64 бита дают выигрыш хотябы в том, что памяти для игры будет больше чем 2 гига.


Грецкий!
Цитата:
-AG- писал(а):
Есть ли реальные преимущества 64-бит над 32-мя, кроме расширения адресного пространства?

Да.
-AG- писал(а):
Все ли типы приложений выиграют при переходе на 64-битный код?

Ряду приложений никакой разницы.
-AG- писал(а):
Может ли 64-битный код ускорить работу приложения?

Да, но не каждого.
-AG- писал(а):
Не может ли получиться так, что само расширение адресного пространства в ряде случаев вызовет снижение эффективности работы кода, например, в результате увеличения задержки при работе с большим количеством случайных данных малого объема?

Нет.
-AG- писал(а):
Наконец, насколько эффективен (или наоборот) переход на 64-бит в игровых приложениях, в частности для расчета сложных матмоделей симуляторов, физики, искуственного интеллекта?

В целом, чем больше вычислений с высокой точностью, тем больше прирост. Надо иметь ввиду, что процессор во время игры занимается непосредственно вычислениями далеко не все время (зависит от самой игры).

Это обсуждалось и достаточно давно.


-AG-
Цитата:
Цитата:
Грецкий! писал(а):
-AG- писал(а):
Есть ли реальные преимущества 64-бит над 32-мя, кроме расширения адресного пространства?
Да.

Не могли бы вы конкретизировать, какие?
Грецкий! писал(а):
В целом, чем больше вычислений с высокой точностью, тем больше прирост. Надо иметь ввиду, что процессор во время игры занимается непосредственно вычислениями далеко не все время (зависит от самой игры).

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


Obscury
Цитата:
Грецкий! писал(а):
-AG писал(а):
Есть ли реальные преимущества 64-бит над 32-мя, кроме расширения адресного пространства?
Да.

Какие, например?
Я кроме увеличения адресного пространства никаких преимуществ не вижу. В своей программисткой практике очень редко сталкивался с необходимостью в 64 битном типе данных. Возможно для каких-то финансовых программ это может помочь, где ещё, даже не знаю. Что касается научных программ, то тут в основном всё вертится вокруг FPU, а на мощность типов double, float и др. битность процессора не влияет. Игровые миры строятся процессором в действительных числах (т.е. здесь тоже важнее FPU), кроме того, в играх больше используются регистры SSEx, которые и так 128 битные и их битность не зависит от битности процессора. Физика - это тоже FPU. Есть, конечно, ещё AI - может там можно что-то выиграть, сомнительно...
А вот расхож памяти увеличится, так как указатели (адреса) теперь 8 байт занимают ...

DenisMak
Цитата:
по теме:
по 64 битам я вижу 2 как минимум очень ценных +
-больше памяти без лишнего геммора
-регистров в 2 раз больше и они в 2 раза шире - больше можно хранить в регистрах не обращаясь к кешу совсем
и один маленький плюс - 64битные данные обрабатываются/могут обрабатываться одной командой вместо... как часто это используется зависит от задачи

но за это надо платить:
-больший перерасход памяти начиная с указателей ...
-контекст задачи становится больше и переключение его занимает больше времени (это как догадка, нигде не читал про 64битный режим)
-(где то здесь на форуме прочитал) возрастает нагрузка на пропускную способность того же кеша (... которая в результате может тормозить, но тоже измерить это стандартными средствами не вижу как.) и кеш хранит меньше параметров хоть и при том же обьёме (размерность параметров увеличивается) (противовес большему кол-ву РОНов)

в общем для себя вижу такую картину - увеличение возможностей использования памяти и скорости части мелких алгоритмов (тут всё сильно зависит от задачи и может действительно быть и 0% прироста а может и >100% достичь если разрядность нужна + новые регистры уменьшат обращение к кешу) за счёт уменьшения производительности _в некоторых/особых_ случаях

это только моё мнение

asmfan
Цитата:
DenisMak писал(а):
но за это надо платить:
-больший перерасход памяти начиная с указателей ...

Они кодируются RIP'ом в 4 байта как и абсолютные указатели в 32битах. Нет недостатков.
DenisMak писал(а):
-контекст задачи становится больше и переключение его занимает больше времени (это как догадка, нигде не читал про 64битный режим)

используются те же инструкции, благо в них заложен буфер подходящий для 32/64 битн. режимов. А запись 8ми (для целоцичленных) и 8ми для ХММ дополнительных регистров не сильно замедляет дела. Нет недостатков.

+Скорость набирается за счёт конвенции вызовов в 64 битах - стек приложения приблизительно постоянен всегда, как неплавающий буфер, т.е. не приходится перемещать указатель стека и выделять новую память. Очень удобно и быстро.

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

Цитата:
pusha/popa нет в 64 битах. API и конвенции вызова для 64 бит предусматривают передачу первых 4х парамтров как через РОН так и ХММ, либо через те и те одновременно в определённых ситуациях.
Под 64 бит ОС 64 выигрывают у 32 из-за отсутствия WOW переходников, посему никакие рекомендации мол если меньше 3х гигов и проч. не должны смущать. Если писать универсальный код, то перекомпиляции ис-под С/С++ компилера будет достаточно.
size_t, *_PTR, прочие макро- и просто фичи для компилера.


Последний раз редактировалось -AG- 01.08.2008 15:14, всего редактировалось 4 раз(а).


Партнер
 

Member
Статус: Не в сети
Регистрация: 01.12.2006
Obscury
Цитата:
Нет, сегментная адресация по факту в Windows не используется - все сегменты наложены друг на друга. Хотя, конечно, операции, скажем, с адресами cs:epi и ds:esi, даже если им соответствует один и тот же линейный адрес, могут закончится не одинаково (например, нельзя писать в сегмент кода). Использовать больше 4Гб памяти позволяют 36 разрядная адресация, для этого необходимо включить режим PAE. В Windows это можно сделать через AWE API. Одновременно нельзя пользоваться всей памятью - в каждый момент доступно только 4Гб памяти (в режиме ядра есстественно). При проецировании окна на другую область памяти, составляются новый каталог страниц и новые таблицы страниц (что приводит к сбросы TLB кэша, кстати). Ну и не терабайты, конечно, а всего-то навсего 64 ГБ.

Давно читал - уже многое забыл :) Но вот например в википедии пишут, что уже 80386 может адресовать 64 Тб виртуальной памяти: http://ru.wikipedia.org/wiki/Intel_80386


Цитата:
Правильно для прерываний, но не забываем, что есть такое системный вызов. Программа для Windows это ОГРОМНОЕ количество системных вызовов и при каждом необходимо много чего сохранять. Вообще, не сохранять РОН можно только если ты один пишешь программу (и то не стоило бы), а если один программист пишет функцию, а другой её вызывает, то как тут можно не сохранять? Не изучать же прогаммистам полностью код друг друга. То же самое и при использовании языков высокого уровня. Скажем если код подгружается динамически из DLL-ки, как тут можно узнать, нужно сохранять регистры или нет? Да даже если всё статически скомпилировано, сомнительно что у компилятора хватит мозгов проанализировать вызывающий код и код функции и сделать оптимизацию - это уже фантастика...

Вот и я о том же. Я когда на асме писал, просто в процедуре сразу писал PUSHA, POPA, RET, что бы потом не загоняться, какие регистры использовать, какие нет. Не исключаю конечно, что умный компилятор может и отследить, какие регистры используются а какие нет, что бы сохранять только нужные. Но это не всегда просто, допустим многие функции возвращаемое значение пишут в регистр (в досе так вообще в порядке вещей - вызываешь 21 прерывание, оно тебе пишет нужную инфу в определенные регистры), так что ИМХО это прокатит только в простейших функциях, а так все равно придется сохранять все.


 

Member
Статус: Не в сети
Регистрация: 02.02.2008
Откуда: Ростов-на-Дону
Фото: 3
Afx писал(а):
что уже 80386 может адресовать 64 Тб виртуальной памяти

да, так и есть, в 32 битной архитектуре виртуальное пространство составляет 2 в 46 степени (что составляет 64 Тб), так как память адресуется парой регистров - 16 битным селектором (где для индекса дискриптора используются только 14 бит - остальные биты связаны с привилегиями) и 32 битным смещением. Просто есть определённая путаница с терминами - виртуальный, линейный, эффективный, программно формируемый (программно доступный), физический. Линейный адрес (он же физический, если отключена страничная адресация) не может состоять больше, чем из 36 бит.
Кстати, в 16 битном режиме виртуальное адресное пространство составляет 4 Гб :) (два 16 битных регистра).
Наверное, в статье про это говорится, сейчас почитаю...
Добавлено спустя 9 минут, 28 секунд
Цитата:
Через страничное преобразование i386 может адресовать до 4 Гбайт физической памяти и до 64 Тбайт виртуальной памяти.

Да уж... Эта фраза без пояснений может ввести в заблуждение (страничная адресация здесь, вообще, не причём). Не читайте люди википедию...


 

Member
Статус: Не в сети
Регистрация: 13.06.2006
Obscury
Obscury писал(а):
То же самое и при использовании языков высокого уровня. Скажем если код подгружается динамически из DLL-ки, как тут можно узнать, нужно сохранять регистры или нет? Да даже если всё статически скомпилировано, сомнительно что у компилятора хватит мозгов проанализировать вызывающий код и код функции и сделать оптимизацию - это уже фантастика...

Почему нет? Компилятор делает очень просто, в начале функции он сохраняет в стек содержимое регистров, которые могут (в случае ветвления) или будут использоваться в коде функции, а это уж он точно знает (он генерирует этот код :)), и в конце функции он их достает из стека. Особого ума от компилятора не требуется. Что происходит в чужом коде так же все равно, главное что бы он восстанавливал все что изменил. Именно так поступает например GCC, про другие говорить не могу, не проверял. Если функция вообще не использует регистры, то для нее и ее вызова не генерируется ни одной пары push pop.
Так же могут поступать и программисты на ассемблере. Тут конечно есть опасность, что чужой код что то испортит, но это должны разруливать либо соглашения между программистами либо соглашения по генерации кода и вызова функций у компиляторов.


Последний раз редактировалось Swappp 01.08.2008 15:17, всего редактировалось 1 раз.

 

Member
Статус: Не в сети
Регистрация: 06.11.2003
Afx Obscury сохранять нужно только те регистры которые не используеются как параметр и не являются возвращаемым значением, а это могут быть далеко не все это раз
и два если мне не изменяет память то как раз вызываЕМАЯ программа должна сохранять индексные и сегментные регистры если она их использует, а роны считаются доступными и изменяемыми. индексными я считаю si и di (16 битный асс, ну и для каждого режима ессно свои расширения, кстати может ещё какие туда же добавились а какие просто забыл) а ронами там ax bx и т.д. конечно давно этим не занимался (уж более 5ти лет точно) но вот такое в памяти осталось, могу и ошибаться


 

Member
Статус: Не в сети
Регистрация: 18.01.2007
Первый пост дополнен наиболее конкретными высказываниями.
Пожалуйста, для ясности, дополняем сообщения дискуссии, по возможности, коротенькими выводами, что привносит в конечную эффективность продукта та или иная особенность программирования под 32/64-бит.
Также просьба, все-таки, прокомментировать выдержки из диалога и использование 32/64-бит в этом конкретном приложении (СЯ) и, в общем случае, в играх, как одном из основных стимулов перехода на 64-бит в быту.
Заранее спасибо всем участникам дискуссии!


 

Member
Статус: Не в сети
Регистрация: 13.06.2006
Прокомментирую сообщения с того форума:
Цитата:
А так, 64 бита дают замедление, т.к. память расходуется сильнее

Где она расходуется сильнее? На указателях да, но например int как был 32 бита, так и остался. А если все таки нужны 64 битные целые числа, то тут этот расход будет компенсирован тем, что операции над ними будут производится за один такт. Теперь вопрос, большую ли часть данных программы занимают указатели? Как правило нет и больше занимают данные на которые они указывают. Так что расход памяти не на столько сильно увеличен, что бы о нем говорить, как о тормозе :)

Ну а больше я там ничего не увидел про производительность и x86_64 :) Только разговоры, что 4Гб это редкость, для меньшего объема 64 бита не нужны и т.п.
Добавлено спустя 7 минут, 17 секунд
Afx
Afx писал(а):
Вот и я о том же. Я когда на асме писал, просто в процедуре сразу писал PUSHA, POPA, RET, что бы потом не загоняться, какие регистры использовать, какие нет.

А вот мне интересно, зачем на ассемблере писать код, который практически заведомо медленнее кода, который могут сгенерировать компиляторы ЯВУ? :) ИМХО уж если действительно появилась необходимость в оптимизации кода, которую можно сделать только на ассемблере, то надо ее делать как минимум не хуже компилятора. А иначе ассемблер это пустая трата времени, причем как процессорного так и рабочего :)


 

Member
Статус: Не в сети
Регистрация: 01.12.2006
Swappp а если в коде попадется функция (в т.ч. системная) которая модифицирует регистры, как компилятор об этом узнает?

Цитата:
Что происходит в чужом коде так же все равно, главное что бы он восстанавливал все что изменил

А где гарантии, что восстанавливает?

DenisMak SI и DI тоже РОНы. (РОНы - это все регистры к которым применимы арифметико-логические операции, к сегментным они например не пременимы, AX, BX, CX, DX, SI, DI, BP и SP - это все РОНы, у кажого из них есть определенная специализация, но это уже другой разговор)


 

Member
Статус: Не в сети
Регистрация: 06.11.2003
Swappp писал(а):
Теперь вопрос, большую ли часть данных программы занимают указатели? Как правило нет и больше занимают данные на которые они указывают.

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


 

Member
Статус: Не в сети
Регистрация: 02.02.2008
Откуда: Ростов-на-Дону
Фото: 3
Swappp писал(а):
Почему нет? Компилятор делает очень просто, в начале функции он сохраняет в стек содержимое регистров, которые могут (в случае ветвления) или будут использоваться в коде функции, а это уж он точно знает (он генерирует этот код ), и в конце функции он их достает из стека. Особого ума от компилятора не требуется. Что происходит в чужом коде так же все равно, главное что бы он восстанавливал все что изменил.

Я говорил о другом - о том, чтобы компилятор не сохранял те регистры, которые портит в функции, зная что они не будут использоваться внешним кодом. Ведь разговор о том, чтобы минимизировать сохранения. Ясно, что компилятор, может сохранить все регистры, на которые есть ссылки в функции. Только это есть плохо в контексте нашего спора об эффективности 64 бит.
DenisMak писал(а):
два если мне не изменяет память то как раз вызываЕМАЯ программа должна сохранять индексные и сегментные регистры если она их использует, а роны считаются доступными и изменяемыми. индексными я считаю si и di (16 битный асс, ну и для каждого режима ессно свои расширения, кстати может ещё какие туда же добавились а какие просто забыл) а ронами там ax bx и т.д. конечно давно этим не занимался (уж более 5ти лет точно) но вот такое в памяти осталось, могу и ошибаться

Да, конечно, есть соглашения по поводу вызовов, но дело в другом - сохранять при 64 битах нужно больше. Насчёт РОН, тут должно быть соглашение - сохранять их или нет (например, ecx может участвовать во внешнем цикле, в ebx храниться какая-то база, только аккумулятор eax и edx по-настояшему являются регистрами общего назначения).
Swappp, DenisMak, вообщем, речь о том, что регистры (не все, конечно) нужно сохранять при вызовах, а в случае системного вызова их количество (сохраняемых регистров) сильно увеличивается, поэтому встаёт вопрос о том не будут ли 64 битные регистры в 64 битном режиме оказывать большую нагрузку на ПСП памяти нежели 32 битные в 32 битном режиме (я в этом не уверен если честно).


Последний раз редактировалось Obscury 01.08.2008 15:54, всего редактировалось 1 раз.

 

Member
Статус: Не в сети
Регистрация: 06.11.2003
Afx не спорю просто я отделить пытался специализированные от арифм-логич регистров и ты кажется это понял ;)


 

Member
Статус: Не в сети
Регистрация: 01.12.2006
Swappp
Цитата:
А вот мне интересно, зачем на ассемблере писать код, который практически заведомо медленнее кода, который могут сгенерировать компиляторы ЯВУ?

Да не было никакой потребности в оптимизации - на асме писал только по учебе + для эксперементов всяких (читай от нефиг делать). Что касается, надо сохранять РОНы или не надо - еще неизвестно что быстрее выполнится, один PUSHA или 4 PUSH xx если например 4 регистра надо сохранить.


 

Member
Статус: Не в сети
Регистрация: 02.02.2008
Откуда: Ростов-на-Дону
Фото: 3
Swappp писал(а):
Теперь вопрос, большую ли часть данных программы занимают указатели? Как правило нет и больше занимают данные на которые они указывают.

Сразу представил двусвязанный список (например, мне нужна быстрая вставка и относительно быстрый доступ к элементам), в каждом элементе которого храниться по одному байту :). А ведь данные программы это как правило различные коллекции (ни один парсер не обойдётся без деревьев или списков - нужна быстрая вставка). Да и не только в указателях дело, есть ещё адреса, просто адреса. Например, любой программист, знающий ассемблер, смотря на сишный код, может представить себе насколько огромным будет количество меток, которые будут в ассемблерном коде, после компиляции сишного. Хотя тут кто-то говорил о том, что они могут быть вовсе не 64 битными, а 32 битными. Может и так.


Последний раз редактировалось Obscury 01.08.2008 16:10, всего редактировалось 2 раз(а).

 

Member
Статус: Не в сети
Регистрация: 06.11.2003
Obscury писал(а):
поэтому встаёт вопрос о том не будут ли 64 битные регистры в 64 битном режиме оказывать большую нагрузку на ПСП памяти нежели 32 битные в 32 битном режиме (я в этом не уверен если честно).

будут и на псп памяти и на нагрузку на кеш, такова расплата, еслиб в процессорах было для 64х битного режима зашито в 2 раза больше кеша и линий связи с кешем тогда мы бы в меньшей степени ощутили это, хотя если честно дома 2 машины с 2г памяти работают на убунте х64 (раньше было на х86) - разницы не увидел (памяти хватает в обоих случаях), все эти нагрузки могут сказываться на приложениях дотошных до ресурсов, а в повседневно жизни - никакой разницы в производительности, а как показывает оптимизированное под х64 ПО дотошное до ресурсов (типа всяких мерилок, зд редакторов/рендеров....) всёже 64 бита лучше, посмотрите на тот же Paint.Net ;) так что разговор разговором а практика показывает факты


 

Member
Статус: Не в сети
Регистрация: 18.01.2007
Цитата:
Swappp, DenisMak, вообщем, речь о том, что регистры (не все, конечно) нужно сохранять при вызовах, а в случае системного вызова их количество (сохраняемых регистров) сильно увеличивается, поэтому встаёт вопрос о том не будут ли 64 битные регистры в 64 битном режиме оказывать большую нагрузку на ПСП памяти нежели 32 битные в 32 битном режиме (я в этом не уверен если честно)

Вот именно? Так как мельком сказано было:
Цитата:
Наоборот, тормозить будет больше, толку ноль.

Цитата:
На данный момент более эффективными по ряду причин. (речь о 32-бит, прим. мое)

Цитата:
Может кто-то хочет заработать денег побыстрее, а на 32 битных системах уже лет 10 ничего нового не придумывается

И были менно косвенно высказы опасения о производительности кешей и связи кешей с ОЗУ. Не возрастет ли нагрузка? Может быть значительно именно при многократном случайном доступе (а для тех же игр это не физика, ИИ и т.п. сложные модели как раз?)?


 

Member
Статус: Не в сети
Регистрация: 02.02.2008
Откуда: Ростов-на-Дону
Фото: 3
Есть предположение, что скорость программ, работающих с цветом (силами процессора, конечно) может возрасти. Ведь цвет это 32 битные величины, и часто приходится их усреднять. Так как цвет распределён равномерно по всему диапазону значений 32 битного целого, чтобы осуществлять усреднение необходим более мощный тип. 64 битного более чем достаточно. Использовать для этого действительные числа плохо, так как не смотря на то что скорость работы с действительными числами почти не уступает скорости работы с целыми, очень тяжёлой операцией является преобразование типов между целыми и числами с плавающей точкой. Ну это так предположение.
P.S. к играм это не относится, так раскарской там ведает GPU.


 

Member
Статус: Не в сети
Регистрация: 13.06.2006
Afx
Afx писал(а):
Swappp а если в коде попадется функция (в т.ч. системная) которая модифицирует регистры, как компилятор об этом узнает?

Зачем ему об этом знать? Функция должна отработать и все регистры, которые не должны быть возвращены в вызывающий код должны вернуть свое первоначальное значение.
Afx писал(а):
А где гарантии, что восстанавливает?

А где гарантии, что функция вообще вернет управлению вызывающему коду? Их нету. Если код написан на ЯВУ, то это задача компилятора, что бы функция возвращала все на место. Но компилятора, который генерирует вызываемый код, а не вызывающий.
DenisMak
DenisMak писал(а):
однако это не значит что их мало и в результате они дают хороший прирост к обьёму использования памяти

Тут конечно надо говорить о конкретной задаче. Можно придумать алгоритм, в которому будет больше указателей чем данных. Но как правило объем занимаемый указателями много меньше объема данных.
Obscury писал(а):
Я говорил о другом - о том, чтобы компилятор не сохранял те регистры, которые портит в функции, зная что они не будут использоваться внешним кодом. Ведь разговор о том, чтобы минимизировать сохранения. Ясно, что компилятор, может сохранить все регистры, на которые есть ссылки в функции. Только это есть плохо в контексте нашего спора об эффективности 64 бит.

Он не знает ничего о внешнем коде. Более того вызов функции может быть из разных мест внешнего кода, а внешний код может быть так же откуда то вызван, где эти регистры используются. Не понимаю, зачем нужна такая минимизация? По моему вполне достаточно того, что бы функция убиралась за собой, это не так уж и затратно. Тем более в 32 битных программах все происходит так же, разница лиш в том, что там кидается 32 бита, а тут 64. Но так же увеличение кол-ва регистров позволяет лишний раз не скидывать промежуточные данные вычислений в стек, что бы освободить регистры для других вычислений. Что частенько дает так же не плохой прирост, особенно в сложных циклах.

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


Последний раз редактировалось Swappp 01.08.2008 16:35, всего редактировалось 1 раз.

 

Member
Статус: Не в сети
Регистрация: 05.12.2006
Откуда: Из-за компутера
Забудьте про push и передачу таким способом параметров - всё делается через mov в конкретную область памяти заранее отведённую на стеке.
Отвечаю тов. Obscury .
Фреймовый стэк выделяется один раз в самом начале исполнения так, чтобы вместить самое большое количество параметров функций используемых в программе - эту вещь анализирует компилер. Далее этот фрейм относительно постоянен, т.к. количетво и размер параметров функций известен компилятору /прототипирование и проч./ Затем этот единый буфер используется для передачи параметров всем ф-ям в приложении включая API с помощью mov [rsp+20] нужный параметр. Таким образом нет активных перемещений указателя и память под стэком всегда или приблизительно всегда в кэше заранее.
В общем,чтобы не гадать на картах, читайте спецификации. Всё очень толково и продумано -> быстро.

_________________
enthusiast


 

Member
Статус: Не в сети
Регистрация: 02.02.2008
Откуда: Ростов-на-Дону
Фото: 3
Swappp писал(а):
Он не знает ничего о внешнем коде. Более того вызов функции может быть из разных мест внешнего кода, а внешний код может быть так же откуда то вызван, где эти регистры используются. Не понимаю, зачем нужна такая минимизация?

Да не нужна конечно, беседа не о том:
Obscury писал(а):
речь о том, что регистры (не все, конечно) нужно сохранять при вызовах, а в случае системного вызова их количество (сохраняемых регистров) сильно увеличивается, поэтому встаёт вопрос о том не будут ли 64 битные регистры в 64 битном режиме оказывать большую нагрузку на ПСП памяти нежели 32 битные в 32 битном режиме (я в этом не уверен если честно).

Добавлено спустя 3 минуты, 15 секунд
asmfan писал(а):
Забудьте про push и передачу таким способом параметров - всё делается через mov в конкретную область памяти заранее отведённую на стеке.

Так понятнее.
Добавлено спустя 10 минут, 56 секунд
Хотя не очень. Как осуществляется последовательность вызовов (например, рекурсия)? База должна меняться, ведь фрейм уже занят, нужно переместиться на новый. Ладно не утруждайся, объяснять, я вижу, ты не любишь, почитаю как-нибудь (хотя ассемблером уже давно не увлекаюсь).


 

member+
Статус: Не в сети
Регистрация: 16.01.2004
Откуда: Estonia,Tallinn
ИМХО 64бита могут дать огромный прирост если изначально писать с их учётом
(а главное включать смекалку и оптимизировать под них всё и вся)
99% программ просто перекомпилируются и всё, от сюда и маленькая разница
Думаю с двухядерностью примерно такая-же история...

_________________
X99-TF/E5-2678v3+Evo212/2x16Gb-DDR4-Gloway-TYPE-a@2133-12-13-13-26/GTX1070TI/KINGSTON-SNV2S1000G


 

Member
Статус: Не в сети
Регистрация: 01.12.2006
Swappp
Цитата:
А где гарантии, что функция вообще вернет управлению вызывающему коду? Их нету. Если код написан на ЯВУ, то это задача компилятора, что бы функция возвращала все на место. Но компилятора, который генерирует вызываемый код, а не вызывающий.

Ты не понимаешь. Некоторые функции СПЕЦИАЛЬНО модифицируют регистры. Просто так задумано. Например, почти любая API функция (по крайней мере в 32 бит, про 64 не скажу) возвращаемое значение пишет в EAX. Ну ладно, допустим компилятор в принципе может знать все апи функции, какая какой регистр портит, а если функции пользовательские? В общем, на мой взгляд если в процедуре вызывается внешняя процедура, то сохранять придется все.

А вообще, мне кажется мы все слишком загнались проблемой сохранения регистров в стек. Ведь стек тоже кэшируется, значит сохранение даже всех 16 64-битных ронов будет производится в кэш (как правило 1 уровня), даже в худшем случае это займет пару десятков тактов. Это не так уж и много, если функция более менее сложная, то этим временем можно пренебречь. Поэтому я и сказал что не стоит злоупотреблять многократным вызовом мелких функций, надо их инлайновыми оформлять (но вообщето это и в 32 бит верно, просто в 64 будет еще больше разница). Щас к сожалению и без асма времени не хватает постоянно, может кто протестит, сколько например занимает вызов 1 млрд раз функции (PUSHA POPA RET) и пустой функции (RET) ? аж самому интересно стало, может мы тут только зря копья ломаем?

DenisMak Я просто не понимаю, чем по твоему мнению таким особым отличаются SI и DI, что их нужно сохранять, а другие нет. Вообще есть правило: процедура должна "прибрать" за собой, т.е. все регистры которая изменила, должна восстановить. Т.е. вызывающая программа не должна заморачиваться сохранением контекста - это дело вызываемой процедуры. И тут нет разницы, о чем идет речь, о ронах или сегментных регистрах (просто последние как правило нет нужды изменять в подпрограмме, но раз уж изменил - изволь прибрать за собой). Что касается индексных регистров, - ничем таким особенным они от остальных ронов не отличаются, сохранять все надо. И арифметические, и логические операции нормально с ними работают так же, как и с остальными. Да, по SI и DI работает базово-индексная адресация, с ними работают строковые команды - но и у AX и DX особая роль в операциях умножения и деления, а по CX можно организовывать цикл, но они от этого не перестают быть РОНами.


Показать сообщения за:  Поле сортировки  
Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 82 • Страница 4 из 5<  1  2  3  4  5  >
-

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 15


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB | Kolobok smiles © Aiwan