Мы здесь переходим на 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 раз(а).
Ты не понимаешь. Некоторые функции СПЕЦИАЛЬНО модифицируют регистры. Просто так задумано. Например, почти любая API функция (по крайней мере в 32 бит, про 64 не скажу) возвращаемое значение пишет в EAX. Ну ладно, допустим компилятор в принципе может знать все апи функции, какая какой регистр портит, а если функции пользовательские? В общем, на мой взгляд если в процедуре вызывается внешняя процедура, то сохранять придется все.
Вообще то есть соглашения, что куда класть в каком случае. Или как, мы вызвали функцию, она что-то изменила, а компилятор об этом не знает? Не смешно ли? Зачем она вообще изменила значение регистра если об этом никто не знает? Для того, что бы в вызываемом коде новым значением могли воспользоваться, значит компилятор должен заранее знать куда положит данные вызываемая функция. Соответственно о ЛЮБОЙ функции должно быть известно что она изменила. То, что она не должна изменять, она должна вернуть в положение, которое было до вызова. Да и потом я то тут причем? Берем отладчик и GCC и смотрим на код, который сгенерировал GCC. И что мы видим, при вызове функций никаких лишних сохранений значений регистров не происходит (хотя в 32 битном коде все же есть лишние сохранения, но только одного регистра), а в коде самих функций кидается в стек содержимое регистров, которые используются в нем для промежуточных расчетов. Некоторые регистры используются для передачи параметров в функцию и обратно, так я с этим не спорю
Afx писал(а):
значит сохранение даже всех 16 64-битных ронов будет производится в кэш (как правило 1 уровня), даже в худшем случае это займет пару десятков тактов. Это не так уж и много, если функция более менее сложная, то этим временем можно пренебречь. Поэтому я и сказал что не стоит злоупотреблять многократным вызовом мелких функций, надо их инлайновыми оформлять (но вообщето это и в 32 бит верно, просто в 64 будет еще больше разница).
Ну нету этого, не сохраняются все РОНы. Если функция мелкая и в ней вообще не используются РОНы, то вообще ничего не сохраняется в стек при ее вызове (опять же для x86_64, для 32 GCC по умолчанию сохраняет один регистр, но ключик -fomit-frame-pointer позволяет этого избежать).
Afx писал(а):
Т.е. вызывающая программа не должна заморачиваться сохранением контекста - это дело вызываемой процедуры. И тут нет разницы, о чем идет речь, о ронах или сегментных регистрах (просто последние как правило нет нужды изменять в подпрограмме, но раз уж изменил - изволь прибрать за собой).
Что то я не понимаю, я об этом и говорю. Вызывающему коду все равно, а вызываемая функция должна за собой прибрать, и вызывающий код полностью на это надеется. Но компилятор (вызываемой функции) то знает что он использует в сгенерированном собой же коде, по этому он знает что надо заранее сохранить, что бы потом восстановить, а что не надо.
По своему опыту. Писал как то программки, cчитающие фракталы. Так наблюдается проигрыш от простой перекомпиляции с 32 на 64 бита около 10 процентов. Но вот выигрыш от многоядерности хорош: на 2х-ядрах многопоточный вариант программы выигрывал 1.7 раза по сравнению с однопоточной, на 4х- 3.8 раза. Причем первоначальная программа писалась без учета многопоточности, а была сделана многопоточной через 2 года за пол часа. Так, что программисты, которые не используют многопоточность и многоядерность просто чрезвычайно ленивы. Пинать их надо ))
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 36
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения