Оптимизация по размеру (sin -> fsin, cos -> fcos, etc)

Тема в разделе "WASM.WIN32", создана пользователем cib, 19 мар 2006.

  1. cib

    cib New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2005
    Сообщения:
    20
    Уважаемые воины дзена, нужна ваша помощь :)



    Можно ли как-нибудь наставить на правильный путь компилятор от MS, чтобы при вызовах функций вида: y = sin(x)

    вместо вызовов sin из MSVCRT генерился код типа fld/fsin?



    Еще очень бы хотелось узнать, можно ли как-нибудь убрать вызовы __p__commode, __p__fmode__set_app_type и т.п.



    В распоряжении имеются VS6, VS2003, VS2005, какой из них лучше использовать (и с какими параметрами для компилятора/линкера), чтобы получить .exe минимального размера?



    Всем заранее спасибо :)
     
  2. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Чтобы не лез за синусами в msvcrt - NODEFAULTLIB для линкера. При этом автоматом лишаешься типов float и double, и чтобы обойтись без них - пишешь макрос SIN в виде асм-вставки, или в виде инлайн ф-ции.

    Чтобы получить минимальный exe - никаких сишных либ, только виндовые апи. Плюс комбинировать секции.
     
  3. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Вот примерчик аналоговых часов, делал на vs2003.

    [​IMG] 1703461670__clock.rar
     
  4. cib

    cib New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2005
    Сообщения:
    20
    cresta

    Спасибо большое! :)

    А что лучше использовать как замену malloc? HeapAlloc?

    Если не ошибаюсь, то malloc сам вызывает HeapAlloc. Но вдруг кто-нибудь посоветует что-нибудь лучше?
     
  5. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Код (Text):
    1. #pragma intrinsic(sin, cos)


    ещё очень полезен флаг /QIfist, но в последнем компиляторе опция похоже не работает :-(



    Дополнительно читай http://rsdn.ru/article/cpp/crt.xml (хотя это больеше по MSVC6 который надо на помойку).
     
  6. cib

    cib New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2005
    Сообщения:
    20
    S_T_A_S_

    Отличная статья, спасибо!



    Что касается /QIfist - я так понимаю, что вызовы _ftol вставляются тогда, когда мы приводим float к int или другому целочисленному типу? А если указана эта опция, то генерится код типа fistp [xxx] и поэтому нельзя заранее знать, каким образом (в какую сторону) произойдет округление?





    А чем плох MSVC6? :)



    Вообще я обычно пользуюсь SlickEdit + Intel C++ Compiler, но для 4k он явно не подходит.
     
  7. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Куда пойдет округление при fistp можно установить флагами FPU.

    Intel C++ Compiler кстати явно лучше работает с FPU и делает округление командой fistp в соответствии со стандартом ANSI C. И размер можно получить иногда меньше чем после MSVC.

    MSVC6 плох кодогенератором, багами и отсутствием поддержки С и С++.
     
  8. ssx

    ssx Member

    Публикаций:
    0
    Регистрация:
    19 авг 2003
    Сообщения:
    336


    зачем так категорично :)

    я им пользовался, пока он не перестал компилить корректныи код :)
     
  9. bers

    bers New Member

    Публикаций:
    0
    Регистрация:
    16 сен 2005
    Сообщения:
    139
    Адрес:
    Russia
    Интересно, а что же тогда поддерживает MSVC6? :))))
     
  10. cib

    cib New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2005
    Сообщения:
    20
    bers

    Я думаю, что S_T_A_S_ подразумевал несоответствие стандартам.
     
  11. SDragon

    SDragon New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2005
    Сообщения:
    133
    Адрес:
    Siberia


    В таких случаях проще всего использовать арифметику с фиксированной точкой и таблицу заранее рассчитанных значений синуса:

    http://www.xakep.ru/post/21210/ (ищи заголовок "Операции с фиксированной точкой")
     
  12. cib

    cib New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2005
    Сообщения:
    20


    Для часов может и лучше, но для 4к интро это не очень-то подходит.
     
  13. Kozyr__

    Kozyr__ New Member

    Публикаций:
    0
    Регистрация:
    28 янв 2005
    Сообщения:
    213
    Адрес:
    Ukraine
    cib

    Для часов может и лучше, но для 4к интро это не очень-то подходит



    имхо, VS для 4к-интро не очень подходит :)

    здесь важен каждый байт - поэтому лучше на асме.



    cresta

    Вот примерчик аналоговых часов, делал на vs2003



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



    зы. сегодня попалась на глаза "в тему" статья
     
  14. cib

    cib New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2005
    Сообщения:
    20


    Я совершенно согласен, в следующий раз буду использовать FASM ;) А в этот раз не сложилось: мой напарник начал уже писать на C, да и к тому же там весьма непростые формулы используются, которые мне совсем не хочется переводить в инструкции FPU - алгоритм несколько объемнее, чем marching cubes ;)))

    Но в следующий раз все будет на асме, потому что мне уже надоело объяснять напарнику, как надо уменьшать код :)

    А сейчас очень не хватает возможности использовать какой-нибудь регистр и знать, что код, который сгенерит компилятор, его не испортит :dntknw:





    Вот это совпадение! :) Как раз она мне попалась вчера! :)



    P.S. У тебя случаем аськи нет? :)
     
  15. Avoidik

    Avoidik New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2004
    Сообщения:
    288
    Адрес:
    Russia
    народ, а вот icppc между процедурами кидает левые команды, можно его как-нибудь вылечить от этого?
     
  16. cib

    cib New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2005
    Сообщения:
    20


    А пример можно?

    Я так понимаю, что речь идет о выравнивании. Что за команды? :) int3 и nop? :)
     
  17. Avoidik

    Avoidik New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2004
    Сообщения:
    288
    Адрес:
    Russia
    cib, про выравнивание знаю, я имею в виду команды вида: mov eax,[eax] (что-то вроде этого, точно не помню) или это тоже выравнивание?!
     
  18. Kozyr__

    Kozyr__ New Member

    Публикаций:
    0
    Регистрация:
    28 янв 2005
    Сообщения:
    213
    Адрес:
    Ukraine
    cib

    Я совершенно согласен, в следующий раз буду использовать FASM ;)



    учишся на чужих (моих) ошибках? :)



    к тому же там весьма непростые формулы используются, которые мне совсем не хочется переводить в инструкции FPU - алгоритм несколько объемнее, чем marching cubes ;)))



    а какой алгоритм признаешься?

    если очень объемный алгоритм, то нужно сделать несколько не критичных педположений, упрощающих вычисления :) (например, какой-нить коэфициент приравнять к единице :)



    У тебя случаем аськи нет?



    лучше сюда: dkozyr(*)gmail.com
     
  19. Kozyr__

    Kozyr__ New Member

    Публикаций:
    0
    Регистрация:
    28 янв 2005
    Сообщения:
    213
    Адрес:
    Ukraine
    Avoidik

    я имею в виду команды вида: mov eax,[eax] (что-то вроде этого, точно не помню) или это тоже выравнивание?!



    похоже на нули между функциями (выравнивание):
    Код (Text):
    1. 0040102B 0000                   add     [eax],al
    2. 0040102D 0000                   add     [eax],al
    3. 0040102F 0000                   add     [eax],al
     
  20. Avoidik

    Avoidik New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2004
    Сообщения:
    288
    Адрес:
    Russia
    Kozyr, тоже не оно, пришлось установить и посмотреть:



    1000117E 59 pop ecx

    1000117F C9 leave

    10001180 C3 retn

    10001181 90 nop

    10001182 8B4424 04 mov eax, dword ptr ss:[esp+4]

    10001186 8B5424 08 mov edx, dword ptr ss:[esp+8]

    1000118A 55 push ebp

    1000118B 8BEC mov ebp, esp

    1000118D 81EC 50040000 sub esp, 450