www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

Čudne odločitve gcc prevajalnika, namenoma ali ne?

 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> ARM arhitektura
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
BluPhenix
Član
Član



Pridružen-a: Pet 05 Mar 2004 12:54
Prispevkov: 1018
Aktiv.: 4.29
Kraj: Sežana

PrispevekObjavljeno: Tor Jul 24, 2007 10:48 am    Naslov sporočila:  Čudne odločitve gcc prevajalnika, namenoma ali ne? Odgovori s citatom

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
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
Glitch
Član
Član



Pridružen-a: Pet 07 Apr 2006 11:40
Prispevkov: 1477
Aktiv.: 6.31

PrispevekObjavljeno: Tor Jul 24, 2007 11:01 am    Naslov sporočila:   Odgovori s citatom

Podaj se verzijo prevajalnika, morebitne flage in primer v Cju.
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
BluPhenix
Član
Član



Pridružen-a: Pet 05 Mar 2004 12:54
Prispevkov: 1018
Aktiv.: 4.29
Kraj: Sežana

PrispevekObjavljeno: Tor Jul 24, 2007 11:24 am    Naslov sporočila:   Odgovori s citatom

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
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
Glitch
Član
Član



Pridružen-a: Pet 07 Apr 2006 11:40
Prispevkov: 1477
Aktiv.: 6.31

PrispevekObjavljeno: Tor Jul 24, 2007 12:01 pm    Naslov sporočila:   Odgovori s citatom

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
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
jur
Član
Član



Pridružen-a: Pet 02 Dec 2005 14:45
Prispevkov: 5142
Aktiv.: 21.67
Kraj: [color=zelena]Ljubljana[/color]

PrispevekObjavljeno: Tor Jul 24, 2007 2:33 pm    Naslov sporočila:   Odgovori s citatom

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
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
BluPhenix
Član
Član



Pridružen-a: Pet 05 Mar 2004 12:54
Prispevkov: 1018
Aktiv.: 4.29
Kraj: Sežana

PrispevekObjavljeno: Tor Jul 24, 2007 4:07 pm    Naslov sporočila:   Odgovori s citatom

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
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
Glitch
Član
Član



Pridružen-a: Pet 07 Apr 2006 11:40
Prispevkov: 1477
Aktiv.: 6.31

PrispevekObjavljeno: Tor Jul 24, 2007 7:51 pm    Naslov sporočila:   Odgovori s citatom

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
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
BluPhenix
Član
Član



Pridružen-a: Pet 05 Mar 2004 12:54
Prispevkov: 1018
Aktiv.: 4.29
Kraj: Sežana

PrispevekObjavljeno: Sre Jul 25, 2007 10:28 am    Naslov sporočila:   Odgovori s citatom

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 Laughing )
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> ARM arhitektura Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Stran 1 od 1

 
Pojdi na:  
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