Kezdőlap › Fórumok › Vegyes felvágott › Programfordítások, optimalizáció
- This topic has 126 hozzászólás, 9 résztvevő, and was last updated 18 years, 1 months telt el by
gabaman.
-
SzerzőBejegyzés
-
2007-06-23-18:18 #2118708zoltan22 wrote:Gondolom valami ilyesmi lehet: mig a cpu el van foglalva a forditassal az egyik folyamaton, addig a masik folyamat beolvashatja a lemezrol a forrasfajlt, amit majd neki fog allni forditani. (amit te mondtal, annak egy sajatos esete)
Ez is igaz, de a C/C++ fordításnál a beolvasandó fájlok 90-95%-a közös, így a memória gyorstárban már megtalálható a nagy többségük. Lassú vinyónál hasznos lehet. Bár ez az elv inkább az N:M típusú szálkezelés sajátossága.
2007-06-23-18:18 #2118709zoltan22 wrote:Gondolom valami ilyesmi lehet: mig a cpu el van foglalva a forditassal az egyik folyamaton, addig a masik folyamat beolvashatja a lemezrol a forrasfajlt, amit majd neki fog allni forditani. (amit te mondtal, annak egy sajatos esete)Ez is igaz, de a C/C++ fordításnál a beolvasandó fájlok 90-95%-a közös, így a memória gyorstárban már megtalálható a nagy többségük. Lassú vinyónál hasznos lehet. Bár ez az elv inkább az N:M típusú szálkezelés sajátossága.
2007-06-23-18:32 #2118710„Ha egy procis géped van, akkor csak a -j1 (vagy a -j elhagyása) a leggyorsabb, mert a több aktívan futó szál rendszeresen üríti a gyorstárat, ezért sokkal több a fő memóriából történő olvasás (10-100x lassabb mint a gyorstár).”
Ez akkor 100%-ig igaz, ha mást nem kalkulálsz bele. (Merevlemez milliárdx lassabb…)
Így aztán – egy gyorsabb cpu-nál – előfordul, hogy a cpu „pihen”.
Én észrevettem – nálam -, hogy 1 szál alkalmazásánál a cpu a legritkább esetben dolgozik 100%-kal. Nyílván – tökéletesen igazad van – 2 szál esetében a hatásfok rosszabb lesz, de a kihasználtság esetleg jobb. (Persze a franc tudja, hogy hogy osztja ki a feladatokat a make. Ha rosszul csinálja, akkor a visszájára is elsülhet…)Egyébként a teoretikus sebesség így néz ki, ha valakit érdekel:
S = =1/(Nszál+(1-Nszál)/Ncpu)
(Amdahl’s tv. egyébként.)
Ez a teoretikus… ebben a fent említett problémák feloldásai nem szerepelnek.2007-06-23-18:32 #2118711„Ha egy procis géped van, akkor csak a -j1 (vagy a -j elhagyása) a leggyorsabb, mert a több aktívan futó szál rendszeresen üríti a gyorstárat, ezért sokkal több a fő memóriából történő olvasás (10-100x lassabb mint a gyorstár).”
Ez akkor 100%-ig igaz, ha mást nem kalkulálsz bele. (Merevlemez milliárdx lassabb…)
Így aztán – egy gyorsabb cpu-nál – előfordul, hogy a cpu „pihen”.
Én észrevettem – nálam -, hogy 1 szál alkalmazásánál a cpu a legritkább esetben dolgozik 100%-kal. Nyílván – tökéletesen igazad van – 2 szál esetében a hatásfok rosszabb lesz, de a kihasználtság esetleg jobb. (Persze a franc tudja, hogy hogy osztja ki a feladatokat a make. Ha rosszul csinálja, akkor a visszájára is elsülhet…)Egyébként a teoretikus sebesség így néz ki, ha valakit érdekel:
S = =1/(Nszál+(1-Nszál)/Ncpu)
(Amdahl’s tv. egyébként.)
Ez a teoretikus… ebben a fent említett problémák feloldásai nem szerepelnek.2007-06-23-18:46 #2118712Teszteltem egyet. A lassabb gyorsabb lett. Egy lefordított progin a ccache újrafordítás sebességét mértem (semmit sem fordított a gcc). Lassabb lett a feldolgozás 2 szálon 3 másodperccel (real), de összességében 25 másodpercet lehetett nyerni az átfedésekkel (real). Ez azért nem jellemző, a ccache-nek sokkal nagyobb a lemezforgalma, mint egy gcc fordításnak. Most nincs időm ccache nélküli fordítási időket összehasonlítani.
-j1:
Code:real 2m38.319s
user 1m17.167s
sys 0m28.503s-j2:
Code:real 2m13.610s
user 1m20.289s
sys 0m29.222s„Ez akkor 100%-ig igaz, ha mást nem kalkulálsz bele. (Merevlemez milliárdx lassabb…)”
Így igaz. De egy viszonylag egyszerű magyarázatba több nem fért bele. Amit írtam az mindíg érvényes, kivétel nélkül. Úgy tippelem, hogy a két hatás (gyorstár csökkenés+lemez olvasási átfedés) egy teljes C++ fordításnál (nincs ccache) nagyjából kiolthatja egymást.„Persze a franc tudja, hogy hogy osztja ki a feladatokat a make. Ha rosszul csinálja, akkor a visszájára is elsülhet…”
Hát, az összes ‘make -C’ sopompóként működik, bevárja az összes szál végrehajtását. Azaz a sok alkönyvtár lassítja a párhuzamos fordítást.2007-06-23-18:46 #2118713Teszteltem egyet. A lassabb gyorsabb lett. Egy lefordított progin a ccache újrafordítás sebességét mértem (semmit sem fordított a gcc). Lassabb lett a feldolgozás 2 szálon 3 másodperccel (real), de összességében 25 másodpercet lehetett nyerni az átfedésekkel (real). Ez azért nem jellemző, a ccache-nek sokkal nagyobb a lemezforgalma, mint egy gcc fordításnak. Most nincs időm ccache nélküli fordítási időket összehasonlítani.
-j1:
Code:real 2m38.319s
user 1m17.167s
sys 0m28.503s-j2:
Code:real 2m13.610s
user 1m20.289s
sys 0m29.222s„Ez akkor 100%-ig igaz, ha mást nem kalkulálsz bele. (Merevlemez milliárdx lassabb…)”
Így igaz. De egy viszonylag egyszerű magyarázatba több nem fért bele. Amit írtam az mindíg érvényes, kivétel nélkül. Úgy tippelem, hogy a két hatás (gyorstár csökkenés+lemez olvasási átfedés) egy teljes C++ fordításnál (nincs ccache) nagyjából kiolthatja egymást.„Persze a franc tudja, hogy hogy osztja ki a feladatokat a make. Ha rosszul csinálja, akkor a visszájára is elsülhet…”
Hát, az összes ‘make -C’ sopompóként működik, bevárja az összes szál végrehajtását. Azaz a sok alkönyvtár lassítja a párhuzamos fordítást.2009-12-04-20:01 #1886559Üdv!
A következő kérdésem lenne:
ki milyen opciókkal fordítja a programjait (már aki ilyen aljas dolgokra vetemedik), és milyen tapasztalatai vannak vele ill. a többi flag-gel?
Nálam:
-Os -march=i686 -fomit-frame-pointer -pipeValamint egy celeron 2GHz-es procival az march-ra mi a legjobb választás?
-
SzerzőBejegyzés
- Be kell jelentkezni a hozzászóláshoz.
legutóbbi hsz