Programfordítások, optimalizáció

Kezdőlap Fórumok Vegyes felvágott Programfordítások, optimalizáció

7 bejegyzés megtekintése - 121-127 / 127
  • Szerző
    Bejegyzés
  • #2118708
    gabaman
    Felhasználó
      zoltan22 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.

      #2118709
      gabaman
      Felhasználó
        zoltan22 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.

        #2118710
        pointux
        Felhasználó

          „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.

          #2118711
          pointux
          Felhasználó

            „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.

            #2118712
            gabaman
            Felhasználó

              Teszteltem 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.

              #2118713
              gabaman
              Felhasználó

                Teszteltem 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.

                #1886559
                csaba
                Felhasználó

                  Ü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 -pipe

                  Valamint egy celeron 2GHz-es procival az march-ra mi a legjobb választás?

                7 bejegyzés megtekintése - 121-127 / 127
                • Be kell jelentkezni a hozzászóláshoz.