Výsledky 1 až 18 z 18

Téma: [C] Optimalizace programu

  1. #1

    Standardní [C] Optimalizace programu

    Potřeboval bych nějaký souhrn "pravidel", díky kterým může třeba Cčkový (nebo jakýkoliv jiný) program běžet rychleji, optimálněji. Našel jsem jen tohle http://www.builder.cz/art/delphi/opt...i.html?tisk=on (pro Delphi).
    Pokud víte o nějaké podobné stránce, dejte prosím vědět.
    http://www.leteckemotory.cz - přes 1000 výsledků z 3D Mark, proudové letecké motory, tutorial na LockOn, fotky z leteckých dnů...

  2. #2

    Standardní

    tenhle článek je celkem obecnej,takže se dá vzít zčásti i na C

  3. #3
    Member
    Založen
    27.10.2002
    Bydliště
    Mn. Hradiste/Pce
    Příspěvky
    381
    Vliv
    265

    Standardní

    mrkni se k manualu svojeho kompilatoru pokud mas gcc tak man g{cc,++}

  4. #4
    Administrátor mince Avatar uživatele Jezevec
    Založen
    08.10.2002
    Bydliště
    Teplice
    Příspěvky
    6 736
    Vliv
    300

    Standardní

    Heh, manual ti nepomuze, nejde o optimalizaci kodu pro CPU, ale predevsim o optimalizaci samotnyho zdrojaku. To se dneska moc nenosi, "radsi koupime vykonejsi HW, nez by sme par dnu resili jak to zrychlit" je dneska beznej pristup.

    Pokud to ovsem delat chces, je dobry zjistit, ktery casti kodu je treba upravit => provadi se nejcasteji, trvaji nejdyl, ... a pak zvolit lepsi (a casto na implementaci slozitejsi) algoritmus, pripadne to prepsat cely do ASM. K tomu zjistovani by ti mel pomoct profiler, je to takovej soft, kterej udela prave tyhle statistiky.

    Napriklad kazda smycka je pomalejsi, nez linearni kod, v pripade prgani v ASM muzes resit, kolik cyklu trva ktera instrukce a podle toho zvolit vyhodnejsi postup (ruzny varianty presunu v pameti ...), prekladac trebas standardne pouzije jump, kterej zabere v pameti 2byte, ktezto ty vis, ze ti staci kratkej skok na 1B ... .
    U takhle napsanyho kodu je samo treba instruovat kompilator aby zadnou optimalizaci uz nedelal, paac to jedine pohnoji.
    IMPROBE AMOR, QUID NON MORTALIA PECTORA COGIS - krutá jsi, lásko, kam až ty doženeš smrtelná srdce -- Vergilius
    Mnoho je prostředků, které léčí lásku, ale žádný není spolehlivý.
    S tím, čeho se na nás dopustili druzí se už nějak vyrovnáme. Horší je to s tím, čeho jsme se na sobě dopustili sami.
    -- Francois La Rochefoucauld
    Nabídnout přátelství tomu, kdo chce lásku, je jako dát chleba tomu, kdo umírá žízní.

  5. #5

    Standardní

    2Jezevec:
    Dej mi pls link na ten Profiler. Nějakej profiler jsem zahlíd na stránkách Intelu, ale chcou nějaké registrace a cosi gdesi. A ani nevím, jestli to je vůbec to správné.

    Ten algoritmus, co tam zatím mám je moře floatových operací (včetně dělení), takže tam je zakopanej pes. Musím se těch dělení a nejlépe i floatů nějak zbavit. Jde o zpracování bitmapy a při rozlišení cca 8000x6000px by to zatím trvalo cca 1,5 hodiny a rád bych to zkrouhnul na minuty.

    Taky jsem teď pokusně zjistil jednu (pro mě) zajímavou věc.
    Když nadeklaruju short integery v mainu, tak jsou operace s nimi cca 5x pomalejší, než když je nadeklaruju globálně. Ostatní datové typy to nedělají - no a právě takové prkotiny mohou mít zásadní vliv na rychlost programu
    http://www.leteckemotory.cz - přes 1000 výsledků z 3D Mark, proudové letecké motory, tutorial na LockOn, fotky z leteckých dnů...

  6. #6
    Administrátor mince Avatar uživatele Jezevec
    Založen
    08.10.2002
    Bydliště
    Teplice
    Příspěvky
    6 736
    Vliv
    300

    Standardní

    Link ti nedam, neprgam, jen vim ze se to pouziva a bejva to soucasti nekterych vyvojovych prostredi stejne jako debuger.
    IMPROBE AMOR, QUID NON MORTALIA PECTORA COGIS - krutá jsi, lásko, kam až ty doženeš smrtelná srdce -- Vergilius
    Mnoho je prostředků, které léčí lásku, ale žádný není spolehlivý.
    S tím, čeho se na nás dopustili druzí se už nějak vyrovnáme. Horší je to s tím, čeho jsme se na sobě dopustili sami.
    -- Francois La Rochefoucauld
    Nabídnout přátelství tomu, kdo chce lásku, je jako dát chleba tomu, kdo umírá žízní.

  7. #7
    Senior Member Avatar uživatele D_a_v_i_d
    Založen
    08.12.2002
    Bydliště
    Praha
    Věk
    42
    Příspěvky
    5 153
    Vliv
    343

    Standardní

    Nejakej profiler melo i stary IDE pro C/C++ od Borlandu (Borland C++), o kompilatoru se bavit nebudem, urcite uz existujou rychlejsi a lepsi, ale profiler ti tu sluzbu IMHO stale jeste udela, aspon v hrube predstave... Kazdopadne jak psal jezevec, nema smysl se s...t s kusem kodu, ktery ve vysledku program provadi jen 1% casu, ale dej si ten profiler a zamer svou pozornost na nejcasteji pouzivatne funkce/procedury....
    A Jedi gains power through understanding; a Sith gains understanding through power

    Destkop machine: Intel Core i5 2400/MSI P67A-C45 /2x4 GB DDR3 1333 MHz/Sapphire HD6790/22" LCD HP w2216/DSL 8MBit connected
    Na filmy v posteli: Lenovo IdeaPad S9e/1,6 GHz Intel Atom, 1 GB RAM, 80 GB HDD
    Na práci: Dell E5500/T9550 2,66 GHz Intel, 3 GB RAM, 120 GB HDD

  8. #8
    Senior Member Avatar uživatele Anduril
    Založen
    12.10.2002
    Bydliště
    OVA, OL
    Věk
    40
    Příspěvky
    3 474
    Vliv
    307

    Standardní

    No podle mě, když ti alg. trvá 1,5h a chceš to dostat na pár minut, tak to bude chtít asi zásadní změnu algoritmu a ne jen optimalizace
    jinak profiler v gnu/mingw se jmenuje 'gprof'.
    ntb: HP EliteBook 8460p i7-2640M | 8GB RAM | 120GB SSD + 500GB HDD | ATi HD6470 | 14" HD+ | W7 PRO
    home: HP Docking Station | HP L2045W | WD 500GB Scorpio Blue USB box
    work: HP Docking Station | HP L2445W
    audio: Epiphone G-400 SG + Sounder Telecaster | E-MU 0202 | Cambridge Audio Azur 340R | Wharfedale Diamond 9.2 | Magnat Betasub 20A | Sennheiser HD555

  9. #9

    Standardní

    Citace Původně odeslal Anduril
    No podle mě, když ti alg. trvá 1,5h a chceš to dostat na pár minut, tak to bude chtít asi zásadní změnu algoritmu a ne jen optimalizace
    jinak profiler v gnu/mingw se jmenuje 'gprof'.
    Už jsem to pořešil ... neuvážlivě jsem tam párkrát použil funkci pow. Jejich odstraněním to jede 12x rychleji EDIT: Nahrazení jednoho foru lineárním kódem (150 řádků navíc), přepínač -O u g++ a pár menších úprav a je to více než 30x rychlejší
    Ta spousta floatových dělení ve výsledném času zabírala jen pár procent.
    Jinak díky všem za rady
    http://www.leteckemotory.cz - přes 1000 výsledků z 3D Mark, proudové letecké motory, tutorial na LockOn, fotky z leteckých dnů...

  10. #10

    Standardní

    Najvacsi problem byva v prasackom algoritme - zbytocne cykly (ako si uz zistil ), viacnasobne prechadzanie vstupneho suboru... Casto sa oplati pouzit trochu viac pamati, ak potom bude algoritmus vyrazne rychlejsi (vselijake tabulky).
    Bezne sa pouziva -O2.
    1: Asus P2B 1.10 • Celeron 1100@1364/1.8V • 512MB SDRAM • Samsung SP1213N+WD AC28400 • Toshiba XM-6402B+SD-M1212 • PowerColor AR2L Radeon 9100 64MB • 3C900-Combo • Bt848A • ASB-3940UA • AWE-64 • DTK PTP-3007 • VisionMaster 405 • Umax UC630 • Star LC24-200 Colour 2: PCPartner TXB820DS • Cyrix MII PR300/1.8V • 256MB SDRAM • 2xSamsung HD400LD+IT8212F • Accesstek CW4001 • LS-120 • Mystique 4MB • Millennium II 4MB • 3C509 • CMI8329A+Dream MIDI • ADI ProVista E44 • SyncMaster 203B Notebook: DTK FortisPro TOP-5A • P166MMX/1.8V • 80MB EDO • Hitachi 5K80 40GB • 12,1" TFT Router: A-Trend ATC-1425B • i486DX 50@33/5V • 48MB FPM • WD AC14300 • UMC UM9003F • HP PC LAN 16/TP+ Car: Mazda 323P BA • Z5 1489ccm, 65kW@5500rpm, 134Nm@4000rpm

  11. #11

    Standardní

    jj, mám tam teď -O3 a už je to rychlost 35x => má maximální spokojenost
    http://www.leteckemotory.cz - přes 1000 výsledků z 3D Mark, proudové letecké motory, tutorial na LockOn, fotky z leteckých dnů...

  12. #12

    Standardní

    pokud jedes GCC a mas to jen pro konkretni stroj tak je dobry pouzivat -march a -mtune ...
    Hrrrr, will you stop using people as human driven search engines? Google.com has all the answers you need.

  13. #13

    Standardní

    Citace Původně odeslal Anatolij
    Už jsem to pořešil ... neuvážlivě jsem tam párkrát použil funkci pow. Jejich odstraněním to jede 12x rychleji EDIT: Nahrazení jednoho foru lineárním
    Kolem tech math funkci se vyplati trochu pobadat a porozhlidnout se, co vsechno knihovny nabizi. Nekdy krome floatovyho powu sou k dispozici treba pow2 na mocniny 2ky, pow10 na mocniny desitky nebo powi s integrovym mocnitelem, kery sou rychlejsi. Na obyc kvadrat pisu proste a*a.

    Dal je dobry naky kratky casto pouzivany fce oznacit klicovym slovem inline nebo je napsat jako makra, ono to volani a predavani parametru taky neco zabere (typ. priklad pouziti treba pro putpixel).

    Pokud pouzivas naku GCC tak zkus este parametry
    -funroll-all-loops -frerun-loop-opt -ffast-math -fomit-frame-pointer

    a march jak rikal fox, napr.
    -march=pentium3 -mmmx -msse

    Gigabyte GA-P67-DS3-B3, Core i7-2600K@4,5GHz, 2xKingston 2GB/1866MHz/CL11, Leadtek 7900GT-256MB DDR3 + Accelero S1, SB-Audigy + YMF724 + DreamBlaster combo, tuner FlyDVB duo, SSD Samsung 840 Pro 128GB + WD1003FBYX RE4 1TB, Seasonic S12II-430, 21" NEC 2190UXp, DVD-RW NEC 4550A->4551A mod, CD-RW Teac 524E, ZIP100, FDD, Canon PowerShot A70, A95+hacked firmware, EOS 350D+CHDK, Pentax K-30, Galaxy S3+CM13, HP ipaq 214, HP 200LX.
    2nd PC: Gigabyte GA-P31-DS3L with custom BIOS, Core2 Duo E8600@4,0GHz, 2xKingston 2GB/1066MHz/CL5
    3rd PC: Abit BX133-Raid, Tualatin 1300@1733/133/1,65V, 2x256MB. WEB: http://rayer.g6.cz

  14. #14

    Standardní

    Citace Původně odeslal RayeR
    Pokud pouzivas naku GCC tak zkus este parametry
    -funroll-all-loops -frerun-loop-opt -ffast-math -fomit-frame-pointer
    to uz obsluhuje -O<x>
    a march jak rikal fox, napr.
    -mmmx -msse
    a tohle -march
    Hrrrr, will you stop using people as human driven search engines? Google.com has all the answers you need.

  15. #15

    Standardní

    A treba si k tomu aj manual precitat:
    Kód:
           -funroll-all-loops
               Unroll all loops, even if their number of iterations is uncertain
               when the loop is entered.  This usually makes programs run more
               slowly.  -funroll-all-loops implies the same options as -fun-
               roll-loops,
    Na niektorych CPU vraj pomaha pouzit optimalizaciu na velkost (-Os) namiesto -O3.
    1: Asus P2B 1.10 • Celeron 1100@1364/1.8V • 512MB SDRAM • Samsung SP1213N+WD AC28400 • Toshiba XM-6402B+SD-M1212 • PowerColor AR2L Radeon 9100 64MB • 3C900-Combo • Bt848A • ASB-3940UA • AWE-64 • DTK PTP-3007 • VisionMaster 405 • Umax UC630 • Star LC24-200 Colour 2: PCPartner TXB820DS • Cyrix MII PR300/1.8V • 256MB SDRAM • 2xSamsung HD400LD+IT8212F • Accesstek CW4001 • LS-120 • Mystique 4MB • Millennium II 4MB • 3C509 • CMI8329A+Dream MIDI • ADI ProVista E44 • SyncMaster 203B Notebook: DTK FortisPro TOP-5A • P166MMX/1.8V • 80MB EDO • Hitachi 5K80 40GB • 12,1" TFT Router: A-Trend ATC-1425B • i486DX 50@33/5V • 48MB FPM • WD AC14300 • UMC UM9003F • HP PC LAN 16/TP+ Car: Mazda 323P BA • Z5 1489ccm, 65kW@5500rpm, 134Nm@4000rpm

  16. #16

    Standardní

    Fox>
    Aha, ja si to takle vytah z nakyho makefilu a leta spokojene pouzival, takze rikas ze teda uplne staci jen -Ox a -march?

    Gigabyte GA-P67-DS3-B3, Core i7-2600K@4,5GHz, 2xKingston 2GB/1866MHz/CL11, Leadtek 7900GT-256MB DDR3 + Accelero S1, SB-Audigy + YMF724 + DreamBlaster combo, tuner FlyDVB duo, SSD Samsung 840 Pro 128GB + WD1003FBYX RE4 1TB, Seasonic S12II-430, 21" NEC 2190UXp, DVD-RW NEC 4550A->4551A mod, CD-RW Teac 524E, ZIP100, FDD, Canon PowerShot A70, A95+hacked firmware, EOS 350D+CHDK, Pentax K-30, Galaxy S3+CM13, HP ipaq 214, HP 200LX.
    2nd PC: Gigabyte GA-P31-DS3L with custom BIOS, Core2 Duo E8600@4,0GHz, 2xKingston 2GB/1066MHz/CL5
    3rd PC: Abit BX133-Raid, Tualatin 1300@1733/133/1,65V, 2x256MB. WEB: http://rayer.g6.cz

  17. #17
    Member
    Založen
    27.10.2002
    Bydliště
    Mn. Hradiste/Pce
    Příspěvky
    381
    Vliv
    265

    Standardní

    nekde sem vyhrabal tohle snad to nekomu pomuze:
    Kód:
    i386 &#40;Intel&#41;
    CHOST="i386-pc-linux-gnu"
    CFLAGS="-march=i386 -O3 -pipe -fomit-frame-pointer"
    CXXFLAGS="-march=i386 -O3 -pipe -fomit-frame-pointer"
    
    i486 &#40;Intel&#41;
    CHOST="i486-pc-linux-gnu"
    CFLAGS="-march=i486 -O3 -pipe -fomit-frame-pointer"
    CXXFLAGS="-march=i486 -O3 -pipe -fomit-frame-pointer"
    
    Pentium I &#40;Intel&#41;
    CHOST="i586-pc-linux-gnu"
    CFLAGS="-march=pentium -O3 -pipe -fomit-frame-pointer"
    CXXFLAGS="-march=pentium -O3 -pipe -fomit-frame-pointer"
    
    
    Pentium MMX &#40;Intel&#41;
    CHOST="i586-pc-linux-gnu"
    CFLAGS="-march=pentium-mmx -O3 -pipe -fomit-frame-pointer"
    CXXFLAGS="-march=pentium-mmx -O3 -pipe -fomit-frame-pointer"
    
    
    Pentium PRO &#40;Intel&#41;
    CHOST="i686-pc-linux-gnu"
    CFLAGS="-march=pentiumpro -O3 -pipe -fomit-frame-pointer"
    CXXFLAGS="-march=pentiumpro -O3 -pipe -fomit-frame-pointer"
    
    
    Pentium II &#40;Intel&#41;
    CHOST="i686-pc-linux-gnu"
    CFLAGS="-march=pentium2 -O3 -pipe -fomit-frame-pointer"
    CXXFLAGS="-march=pentium2 -O3 -pipe -fomit-frame-pointer"
    
    
    Celeron &#40;Mendocino&#41; Celeron1 &#40;Intel&#41;
    CHOST="i686-pc-linux-gnu"
    CFLAGS="-march=pentium2 -O3 -pipe -fomit-frame-pointer"
    CXXFLAGS="-march=pentium2 -O3 -pipe -fomit-frame-pointer"
    
    
    Pentium III &#40;Intel&#41;
    CHOST="i686-pc-linux-gnu"
    CFLAGS="-march=pentium3 -O3 -pipe -fomit-frame-pointer"
    CXXFLAGS="-march=pentium3 -O3 -pipe -fomit-frame-pointer"
    
    
    Celeron &#40;Coppermine&#41; Celeron2 &#40;Intel&#41;
    CHOST="i686-pc-linux-gnu"
    CFLAGS="-march=pentium3 -O3 -pipe -fomit-frame-pointer"
    CXXFLAGS="-march=pentium3 -O3 -pipe -fomit-frame-pointer"
    
    
    Celeron &#40;Willamette?&#41; &#40;Intel&#41;
    CHOST="i686-pc-linux-gnu"
    CFLAGS="-march=pentium4 -O3 -pipe -fomit-frame-pointer"
    CXXFLAGS="-march=pentium4 -O3 -pipe -fomit-frame-pointer"
    
    
    Pentium IV &#40;Intel&#41;
    CHOST="i686-pc-linux-gnu"
    CFLAGS="-march=pentium4 -O3 -pipe -fomit-frame-pointer"
    CXXFLAGS="-march=pentium4 -O3 -pipe -fomit-frame-pointer"
    
    
    K6 &#40;AMD&#41;
    CHOST="i586-pc-linux-gnu"
    CFLAGS="-march=k6 -O3 -pipe -fomit-frame-pointer"
    CXXFLAGS="-march=k6 -O3 -pipe -fomit-frame-pointer"
    
    
    K6-2 &#40;AMD&#41;
    CHOST="i586-pc-linux-gnu"
    CFLAGS="-march=k6-2 -O3 -pipe -fomit-frame-pointer"
    CXXFLAGS="-march=k6-2 -O3 -pipe -fomit-frame-pointer"
    
    
    K6-3 &#40;AMD&#41;
    CHOST="i586-pc-linux-gnu"
    CFLAGS="-march=k6-3 -O3 -pipe -fomit-frame-pointer"
    CXXFLAGS="-march=k6-3 -O3 -pipe -fomit-frame-pointer"
    
    
    Duron &#40;AMD&#41;
    CHOST="i686-pc-linux-gnu"
    CFLAGS="march=athlon-xp -O3 -pipe -fomit-frame-pointer"
    CXXFLAGS="-march=athlon-xp -O3 -pipe -fomit-frame-pointer"
    
    
    Athlon &#40;AMD&#41;
    CHOST="i686-pc-linux-gnu"
    CFLAGS="-march=athlon -O3 -pipe -fomit-frame-pointer"
    CXXFLAGS="-march=athlon -O3 -pipe -fomit-frame-pointer"
    
    
    Athlon 4 &#40;AMD&#41;
    CHOST="i686-pc-linux-gnu"
    CFLAGS="-march=athlon-4 -O3 -pipe -fomit-frame-pointer"
    CXXFLAGS="-march=athlon-4 -O3 -pipe -fomit-frame-pointer"
    
    
    Athlon XP &#40;AMD&#41;
    CHOST="i686-pc-linux-gnu"
    CFLAGS="-march=athlon-xp -O3 -pipe -fomit-frame-pointer"
    CXXFLAGS="-march=athlon-xp -O3 -pipe -fomit-frame-pointer"
    
    
    Athlon MP &#40;AMD&#41;
    CHOST="i686-pc-linux-gnu"
    CFLAGS="-march=athlon-mp -O3 -pipe -fomit-frame-pointer"
    CXXFLAGS="-march=athlon-mp -O3 -pipe -fomit-frame-pointer"
    
    
    603 &#40;PowerPC&#41;
    CHOST="powerpc-unknown-linux-gnu"
    CFLAGS="-O3 -pipe
    CXXFLAGS="-O3 -pipe
    
    
    603e &#40;PowerPC&#41;
    CHOST="powerpc-unknown-linux-gnu"
    CFLAGS="-O3 -pipe
    CXXFLAGS="-O3 -pipe
    
    
    604 &#40;PowerPC&#41;
    CHOST="powerpc-unknown-linux-gnu"
    CFLAGS="-O3 -pipe
    CXXFLAGS="-O3 -pipe
    
    
    604e &#40;PowerPC&#41;
    CHOST="powerpc-unknown-linux-gnu"
    CFLAGS="-O3 -pipe
    CXXFLAGS="-O3 -pipe
    
    
    750 alias G3 &#40;PowerPC&#41;
    CHOST="powerpc-unknown-linux-gnu"
    CFLAGS="-mcpu=750 -O3 -pipe -mpowerpc-gfxopt"
    CXXFLAGS="-mcpu=750 -O3 -pipe -mpowerpc-gfxopt"
    
    
    7400 alias G4 &#40;PowerPC&#41;
    CHOST="powerpc-unknown-linux-gnu"
    CFLAGS="-mcpu=7400 -O2 -pipe -maltivec -mabi=altivec -mpowerpc-gfxopt"
    CXXFLAGS="-mcpu=7400 -O2 -pipe -maltivec -mabi=altivec -mpowerpc-gfxopt"
    
    
    Sparc 64
    CHOST="sparc-unknown-linux-gnu"
    CFLAGS="-O3 -pipe -fomit-frame-pointer"
    CXXFLAGS="-O3 -pipe -fomit-frame-pointer"

  18. #18

    Standardní

    Citace Původně odeslal RayeR
    Fox>
    Aha, ja si to takle vytah z nakyho makefilu a leta spokojene pouzival, takze rikas ze teda uplne staci jen -Ox a -march?
    afaik by tomu tak melo bejt
    ale treba na venice je potreba pridat -msse3 protoze v -march=k8 to neni ...
    dalsi (ale nepodporovana) vec ktera jde pridat je -mfpmath=sse,387 (pouziva na FP operace jak SSE tak kopr, ale udajne to neni moc stable (me to na WS imo funguje vpohode))
    Hrrrr, will you stop using people as human driven search engines? Google.com has all the answers you need.

Informace o tématu

Users Browsing this Thread

Toto téma si právě prohlíží 1 uživatelů. (0 registrovaných a 1 anonymních)

Pravidla přispívání

  • Nemůžete zakládat nová témata
  • Nemůžete zasílat odpovědi
  • Nemůžete přikládat přílohy
  • Nemůžete upravovat své příspěvky
  •