 |
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
BluPhenix Član

Pridružen-a: Pet 05 Mar 2004 12:54 Prispevkov: 1018 Aktiv.: 4.29 Kraj: Sežana
|
Objavljeno: Tor Jul 24, 2007 10:48 am Naslov sporočila: Čudne odločitve gcc prevajalnika, namenoma ali ne? |
|
|
Zadnej čase opažam nekatere čudne odločitve gcc prevajalnika. Imam eno funkcijo, ki bi jo rad zmanjšal kolikor se da, zato sledim, kaj naredi prevajalnik.
Opazil sem dve čudni stvari:
1) sploh noče uporabljati MUL ukaza, vztraja z mov-add operacijami. Gre za množenje s konstanto 1000. To, da se včasih tako odloči, ker je za določene operacije lahko hitrejše so mi že razloižili, vem tudi to, da množenje uporabi do 5 ciklov, vendar koda ki mi jo sproducira prevajalnih ima vsaj 8 ukazov za zgornje množenje, torej 3 več kot multiplikacija.
2) čudno "nalaganje" naslovov hardverskih registrov, npr: T0MR0=0xe0004018, compiler z določitvijo naslova reši na sledeči način:
Koda: |
mov r3, #E0000000
add r3, r3, #4000
add r3, r3 #18
|
Je kakšen poseben razlog, da ne naredi mov r3, #E0004018 ? Je to morda zaradi tega, ker so hardverski registri definirani kot volatile?
Če kdo ve kaj o teh dveh "problemih" bi bil zelo hvaležen, če bi se mu dalo kaj razložiti. |
|
Nazaj na vrh |
|
 |
Glitch Član

Pridružen-a: Pet 07 Apr 2006 11:40 Prispevkov: 1477 Aktiv.: 6.31
|
Objavljeno: Tor Jul 24, 2007 11:01 am Naslov sporočila: |
|
|
Podaj se verzijo prevajalnika, morebitne flage in primer v Cju. |
|
Nazaj na vrh |
|
 |
BluPhenix Član

Pridružen-a: Pet 05 Mar 2004 12:54 Prispevkov: 1018 Aktiv.: 4.29 Kraj: Sežana
|
Objavljeno: Tor Jul 24, 2007 11:24 am Naslov sporočila: |
|
|
Uh se oproščam, pozabil.
Verzija je 4.0.2
flagi: -mcpu=arm7tdmi -o0 -gdwarf-2 -c
množenje:
Koda: |
void wait(unsigned long time){
time=time*1000;
T0MR0=(time >> 6);
...
|
Kot že napisano množenje naredi z mov add (vrednost shrani na [r11,-0010]), pri premikanju vrednosti v register pa:
Koda: |
mov r3, #E0000000
add r3, r3, #4000
add r3, r3 #18
ldr r2,[r11,-0010]
mov r2,r2,lsr #06
str r2,[r3,0000]
|
|
|
Nazaj na vrh |
|
 |
Glitch Član

Pridružen-a: Pet 07 Apr 2006 11:40 Prispevkov: 1477 Aktiv.: 6.31
|
Objavljeno: Tor Jul 24, 2007 12:01 pm Naslov sporočila: |
|
|
Eden od vplivov je definitivno optimizacijski faktor. Drugi je thumb/arm nacin. Tretji je pa velikost konstante.
Moja verzija je 4.1.1. in naredi malce drugacno kodo, ampak mnozenje s konstanto je narejeno s sestevanji in siftanjem. Odvisno je od velikosti konstante. Ce jo povecas, jo spremeni v mul ukaz. Mul ukaz bo prevajalnik uporabil tudi v primeru, ce podas konstanto kot parameter. |
|
Nazaj na vrh |
|
 |
jur Član


Pridružen-a: Pet 02 Dec 2005 14:45 Prispevkov: 5142 Aktiv.: 21.67 Kraj: [color=zelena]Ljubljana[/color]
|
Objavljeno: Tor Jul 24, 2007 2:33 pm Naslov sporočila: |
|
|
Optimizacije imajo v programih čudne efekte. Delphi na primer z vključeno optimizacijo, v zankah šteje v obratni smeri, kot je sprogramirano. Stavek "For i:=0 to 10 do something" logično šteje od nič do 10, dejansko pa gre od 10 na dol do ničle. Zakaj: pri štetju na gor, moramo vsakič ko povečamo števec za eno, primerjati ali je rezultat že 10 (cel kup instrukcij). Če pa štejemo na dol, je za odštevanje in testiranje ničle skupaj ena sama instrukcija (decrement and skip if zero). A štejemo v zanki gor ali dol, je skoraj vedno vseeno. Poudarek je na besedi "skoraj". Ko program ne dela prav, je lahko napaka v programu... ali pa vključena optimizacija.
Ravno tako je namesto deljenja ali množenja (aritmetična operacija) bistveno hitrejša logična operacija shift (desno ali levo).
Čudne odločitve prevajalnika so običajno logične in učinkovite. Za učenje pa je včasih optimizacijo bolje izklopiti.
Jur |
|
Nazaj na vrh |
|
 |
BluPhenix Član

Pridružen-a: Pet 05 Mar 2004 12:54 Prispevkov: 1018 Aktiv.: 4.29 Kraj: Sežana
|
Objavljeno: Tor Jul 24, 2007 4:07 pm Naslov sporočila: |
|
|
Ja te finte z optimizacijo sem že opazil. Predvsem to, da ko jo vklopiš pol stvari več ne dela (seveda, ker nisi kodiral z mislijo nanjo).
Danes sem videl kako izvaja deljenje in moram reči da je bilo hudo presenečenje, ki mi ni še popolnoma jasno, ampak bomo razvozlali, ko bomo rabili.
Ko pa že govorimo o optimizaciji, sam sem iskal kaj literature o -o switchu, ampak našel bolj malo. Lahko kdo kaj priporoči? Lahko tudi kakšne napotke pri programiranju z optimizacijo v mislih.
Hvala za pomoč. |
|
Nazaj na vrh |
|
 |
Glitch Član

Pridružen-a: Pet 07 Apr 2006 11:40 Prispevkov: 1477 Aktiv.: 6.31
|
Objavljeno: Tor Jul 24, 2007 7:51 pm Naslov sporočila: |
|
|
Hm... kako podrobne informacije pa zelis? Pravkar sem tudi sam pogooglal in prvi trije linki kar lepo opisejo optimizacijske nivoje pri GCCju. Recimo: http://www.linuxjournal.com/article/7269
Orto optimizacija je mozna tudi s posameznimi flagi.
Je pa tega ogromno, da bi tukaj vse razlagal. Kar si napisal o misli na optimizacijo je tudi res. Ni ravno vseeno kako je program napisan. Ampak to pride predvsem s precej programiranja.
"Premature optimization is root of all evil!". Imej to v mislih.
Nazadnje urejal/a Glitch Sre Jul 25, 2007 1:57 pm; skupaj popravljeno 1 krat |
|
Nazaj na vrh |
|
 |
BluPhenix Član

Pridružen-a: Pet 05 Mar 2004 12:54 Prispevkov: 1018 Aktiv.: 4.29 Kraj: Sežana
|
Objavljeno: Sre Jul 25, 2007 10:28 am Naslov sporočila: |
|
|
Evo to je to kar sem rabil, za začetno čtivo bo kar super, hvala.
Sam sem tudi iskalo po googlu, ampak sem očitno iskal z napačnim geslom, saj me je vedno vrglo samo na novičarske skupine kjer ni bilo nič uporabnega (navadno samo dumpi kode).
To zadnje bom vsekakor imel v mislih (sem nekaj že izkusin na lastni koži ) |
|
Nazaj na vrh |
|
 |
|
|
Ne, ne moreš dodajati novih tem v tem forumu Ne, ne moreš odgovarjati na teme v tem forumu Ne, ne moreš urejati svojih prispevkov v tem forumu Ne, ne moreš brisati svojih prispevkov v tem forumu Ne ne moreš glasovati v anketi v tem forumu Ne, ne moreš pripeti datotek v tem forumu Ne, ne moreš povleči datotek v tem forumu
|
Uptime: 1 dni
Powered by phpBB © 2001, 2005 phpBB Group
|