Существует ли тулза автоматизирующая (хотя бы частично) процесс оптимизации программы?

Тема в разделе "WASM.ASSEMBLER", создана пользователем Oleg_SK, 20 мар 2005.

  1. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    semen

    Такие "хинты" я знаю. Это не "правильно", а "без ошибок". Ну зачем там левые пересылки через память :) тогда уж проще __stdcall делать.
     
  2. semen

    semen New Member

    Публикаций:
    0
    Регистрация:
    8 июн 2004
    Сообщения:
    334
    Адрес:
    Russia
    S_T_A_S_

    Ну раз знаешь, то что говоришь, что



    когда строго говоря это не так, а при WPO еще параметры передаются в любых регистрах, для любых функций (в том числе и __fastcall), на что я изначально и указал. Вдобавок сказал, что при WPO ассемблерные вставки как их делают обычно не работают, a чтоб заработали надо парамерты загружать и никакого другого солюшена для юзанья асм вставкой тут нет (intrinsic`и могут спасти), так как теперь нет соглашений о вызовах функций. Вот и все что я сказал в 2х предложениях и вроде нигде не ошибся.
     
  3. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    semen



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







    когда модули компилируются по раздельности, компилятор не знает ничего о "внешних" переменных и функциях, соответственно не может делать подстановку кода/значений. при ключе /GL объектники совсем другие - это видимо промежуточная фаза компиляции какая-то, а не код, который осталось слинковать. даже надпись Generating code появляется после того, как объектники готовы. поэтому я и говорю, что можно включать модули один в другой - эффект будет тот же. просто так "не принято делать".



    Вот простейший пример:



    a.cpp
    Код (Text):
    1. //#include "b.cpp"
    2. extern const int foo;
    3. int start(){ return foo; }




    b.cpp
    Код (Text):
    1. extern const int foo = 5;




    cl /Og a.cpp b.cpp
    Код (Text):
    1. a.<Module>/$  A1 00204000   mov     eax, [402000]
    2. 00401005  \.  C3            retn




    cl /Og /GL a.cpp b.cpp
    Код (Text):
    1. a.<Module>/$  B8 05000000   mov     eax, 5
    2. 00401005  \.  C3            retn




    cl /Og a.cpp (строка #include активна)
    Код (Text):
    1. a.<Module>/$  B8 05000000   mov     eax, 5
    2. 00401005  \.  C3            retn




    И ещё один:



    a.cpp
    Код (Text):
    1. //#include "b.cpp"
    2. extern int foo();
    3. int start(){ return foo(); }




    b.cpp
    Код (Text):
    1.  
    2. extern int foo(){ return 5; };




    cl /O2g a.cpp b.cpp
    Код (Text):
    1.  
    2. a.<Module>/$ /E9 0B000000    jmp     a.00401010
    3.  
    4. 00401010  |> \B8 05000000    mov     eax, 5
    5. 00401015  \.  C3             retn




    cl /O2g /GL a.cpp b.cpp
    Код (Text):
    1. a.<Module>/$  B8 05000000   mov     eax, 5
    2. 00401005  \.  C3            retn




    cl /O2g a.cpp (строка #include активна)
    Код (Text):
    1. a.<Module>/$  B8 05000000   mov     eax, 5
    2. 00401005  \.  C3            retn
     
  4. semen

    semen New Member

    Публикаций:
    0
    Регистрация:
    8 июн 2004
    Сообщения:
    334
    Адрес:
    Russia
    S_T_A_S_

    Ну так тогда о чем спорим :) мы оба об WPO все прекрасно знаем и понимаем :))

    Я же просто указал, что на данных компиляторах с WPO есть дополнительный бонус, который недостижим, компилируя все в одном .cpp - передача параметров в любых регистрах. Без WPO даже в пределах одного модуля это невозможно...
     
  5. pev

    pev New Member

    Публикаций:
    0
    Регистрация:
    22 мар 2005
    Сообщения:
    3
    Ну и опять по теме :)



    тулза от автора книги 'Hacker's Delight' aka 'Алгоритмические трюки для програмистов':

    A superoptimizer is a program that makes a serious attempt at finding optimal code, in the sense of a minimal number of instructions, for a given function. It works by trying all sequences of computational instructions of a given length, simulating each sequence for various inputs, until it finds (stumbles on) a sequence that matches a given user-defined function.



    http://www.hackersdelight.org/aha.zip

    // Прога под Линух (Cygwin).



    valterg

    Oleg_SK: "Под оптимизацией я здесь подразумеваю к примеру изменение порядка следования команд не влияющее на функционирование программы, но позволяющее увеличить скорость ее работы и т.д. и т.п."

    т.е. вопрос об автоматизации оптимизирования планирования инструкций/уменьшения размеров кода и т.п. - последняя стадия оптимизации, а профайлер - первая.



    Естественно вышеуказанные инструменты не оптимизируют всю программу, их предназначение - оптимизация кусков кода и избавление программера от выполнения рутинной работы (о чём и 'мечтал' Oleg_SK :).
     
  6. captain cobalt

    captain cobalt New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2003
    Сообщения:
    222
    Адрес:
    /ru/perm
    [ <font color="gray]A superoptimizer is a program that makes a serious attempt at finding optimal code</font><!--color--> ]



    Это, очевидно, шутка (незлая).



    Однако, существует гораздо более серъёзный подход к проблеме. Правда, называется тоже весьма забавным словом: Supercompiler. Кому-нибудь что-нибудь известно об этом?
     
  7. pev

    pev New Member

    Публикаций:
    0
    Регистрация:
    22 мар 2005
    Сообщения:
    3
    captain cobalt

    Ну, чтобы было очевидно, что шутка, надо, наверное, скачать эти 90 кбайт, внимательно почитать доки, попробовать прогу в действии и другим рассказать, что это за зверь ;)

    А вообще, 'шутка' развивалась с 16.03.02 по 22.04.03, да и автор как-то на шутника не похож.
     
  8. captain cobalt

    captain cobalt New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2003
    Сообщения:
    222
    Адрес:
    /ru/perm
    Да, это шутка.

    Но это не значит "первоапрельская шутка". ;)

    или то что "это невозможно".



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



    Здесь можно было бы привести (и прокомментировать!) цитаты из документации, но не буду. ;)



    Тем не менее, ничто автоматически оптимизирующее мне не чуждо. ;)



    После небольшого гугления удалось найти одну статью, на которую есть ссылка из документации:



    <font size=1>Granlund, Kenner - Eliminating Branches using a Superoptimizer and the GNU C Compiler (1992)</font><!--size-->

    www.swox.com/~tege/gso-pldi92.pdf



    Но не оригинальную статью Massalin-а. :dntknw:



    И ещё одна статья (посолидней)



    <font size=1>Joshi, Nelson, Randall - Denali: a goal-directed superoptimizer (2001)</font><!--size-->

    http://www.hpl.hp.com/techreports/Compaq-DEC/SRC-RR-171.pdf