GCC + VS Compiler kombinieren?



  • Verschiedene Systeme mit verschiedenen OS: da gibts viel zu viel unbekannte Variable, um eine ordentliche Aussage zu machen. Wenn du die Performance von verschiedenen Compilern messen willst, musst du das auf dem gleichen System machen. Sonst spielen dir von OS-Scheduler ueber unterschiedliche Cache-Groessen, Hintergrundsprozessen und Hardware-Configurationen alles moegliche mit rein.

    Dass der Unterschied zwischen GCC und VS doch so betraechtlich ist, ist beachtlich. Welche Compiler-Optionen hast du denn jeweils verwendet?



  • Blue-Tiger schrieb:

    Dass der Unterschied zwischen GCC und VS doch so betraechtlich ist, ist beachtlich. Welche Compiler-Optionen hast du denn jeweils verwendet?

    GCC: -O3 -march=pentium4 (letzteres hat nochmal auf 29% gedrückt)
    VS: /02 /GL (/arch:SSE hat aber nichts gebracht, kann auch aus sein...)

    Die Prozente beziehen sich auf den Audio-Thread. Das laden des GUIs verhält sich wiefolgt: GCC ca 5-10s, VS: 1s

    Wie verhält es sich eigentlich mit den neuen VS-Compilern in der Express-Version. Ich hab mal gehört, der VS2008 Express Compiler wär langsamer als der 2005er (von wegen: Kauf dir die Vollversion!), deshalb benutze ich noch den 2005er.

    Wahrscheinlich schlagt ihr jetzt die Hände überm Kopf zusammen und sagt: dann nimm den 2010er. Meint ihr, dass sich das Compilermäßig lohnen könnte?

    Vielen Dank
    Sören



  • soerenP schrieb:

    Blue-Tiger schrieb:

    Dass der Unterschied zwischen GCC und VS doch so betraechtlich ist, ist beachtlich. Welche Compiler-Optionen hast du denn jeweils verwendet?

    GCC: -O3 -march=pentium4 (letzteres hat nochmal auf 29% gedrückt)

    Nimm lieber -march=native

    btw. für windows gibt es doch gar keinen offiziellen GCC :p



  • Ok. Danke.

    Ich nutze die TDM MinGW Geschichte...

    Was genau macht -march:native?

    Benutzt er die Werte der Entwicklermaschine oder baut er Schalter im Code ein für die Maschine, auf der das Ding läuft?



  • -march=native setzt entsprechende Optimierungsflags für die aktuelle Architektur. Mittels
    echo "int main() { }" > test.c++ && g++ -v -Q -march=native -O3 test.c++ && rm test.c++ a.out

    kannst du rausfinden, was der GCC genau macht. zB bei mir

    Using built-in specs.
    Target: x86_64-linux-gnu
    Configured with: ../src/configure -v --with-pkgversion='Ubuntu 4.4.1-4ubuntu9' --with-bugurl=file:///usr/share/doc/gcc-4.4/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --enable-shared --enable-multiarch --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.4 --program-suffix=-4.4 --enable-nls --enable-clocale=gnu --enable-libstdcxx-debug --enable-objc-gc --disable-werror --with-arch-32=i486 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
    Thread model: posix
    gcc version 4.4.1 (Ubuntu 4.4.1-4ubuntu9) 
    COLLECT_GCC_OPTIONS='-v' '-Q'  '-O3' '-shared-libgcc'
     /usr/lib/gcc/x86_64-linux-gnu/4.4.1/cc1plus -v -D_GNU_SOURCE test.c++ -D_FORTIFY_SOURCE=2 -march=core2 -mcx16 -msahf -msse4.1 --param l1-cache-size=32 --param l1-cache-line-size=64 --param l2-cache-size=2048 -mtune=core2 -dumpbase test.c++ -auxbase test -O3 -version -fstack-protector -o /tmp/cco7J6Lc.s
    ignoring nonexistent directory "/usr/local/include/x86_64-linux-gnu"
    ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/4.4.1/../../../../x86_64-linux-gnu/include"
    #include "..." search starts here:
    #include <...> search starts here:
     /usr/include/c++/4.4
     /usr/include/c++/4.4/x86_64-linux-gnu
     /usr/include/c++/4.4/backward
     /usr/local/include
     /usr/lib/gcc/x86_64-linux-gnu/4.4.1/include
     /usr/lib/gcc/x86_64-linux-gnu/4.4.1/include-fixed
     /usr/include/x86_64-linux-gnu
     /usr/include
    End of search list.
    GNU C++ (Ubuntu 4.4.1-4ubuntu9) version 4.4.1 (x86_64-linux-gnu)
            compiled by GNU C version 4.4.1, GMP version 4.3.1, MPFR version 2.4.1-p2.
    GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
    options passed:  -v -D_GNU_SOURCE test.c++ -D_FORTIFY_SOURCE=2
     -march=core2 -mcx16 -msahf -msse4.1 --param l1-cache-size=32 --param
     l1-cache-line-size=64 --param l2-cache-size=2048 -mtune=core2 -O3
     -fstack-protector
    options enabled:  -falign-labels -falign-loops -fargument-alias
     -fasynchronous-unwind-tables -fauto-inc-dec -fbranch-count-reg
     -fcaller-saves -fcommon -fcprop-registers -fcrossjumping
     -fcse-follow-jumps -fdefer-pop -fdelete-null-pointer-checks
     -fdwarf2-cfi-asm -fearly-inlining -feliminate-unused-debug-types
     -fexceptions -fexpensive-optimizations -fforward-propagate -ffunction-cse
     -fgcse -fgcse-after-reload -fgcse-lm -fguess-branch-probability -fident
     -fif-conversion -fif-conversion2 -findirect-inlining -finline
     -finline-functions -finline-functions-called-once -finline-small-functions
     -fipa-cp -fipa-cp-clone -fipa-pure-const -fipa-reference
     -fira-share-save-slots -fira-share-spill-slots -fivopts
     -fkeep-static-consts -fleading-underscore -fmath-errno -fmerge-constants
     -fmerge-debug-strings -fmove-loop-invariants -fomit-frame-pointer
     -foptimize-register-move -foptimize-sibling-calls -fpeephole -fpeephole2
     -fpredictive-commoning -freg-struct-return -fregmove -freorder-blocks
     -freorder-functions -frerun-cse-after-loop -fsched-interblock -fsched-spec
     -fsched-stalled-insns-dep -fschedule-insns2 -fsigned-zeros
     -fsplit-ivs-in-unroller -fsplit-wide-types -fstack-protector
     -fstrict-aliasing -fstrict-overflow -fthread-jumps -ftoplevel-reorder
     -ftrapping-math -ftree-builtin-call-dce -ftree-ccp -ftree-ch
     -ftree-copy-prop -ftree-copyrename -ftree-cselim -ftree-dce
     -ftree-dominator-opts -ftree-dse -ftree-fre -ftree-loop-im
     -ftree-loop-ivcanon -ftree-loop-optimize -ftree-parallelize-loops=
     -ftree-pre -ftree-reassoc -ftree-scev-cprop -ftree-sink -ftree-sra
     -ftree-switch-conversion -ftree-ter -ftree-vect-loop-version
     -ftree-vectorize -ftree-vrp -funit-at-a-time -funswitch-loops
     -funwind-tables -fvar-tracking -fvect-cost-model -fzero-initialized-in-bss
     -m128bit-long-double -m64 -m80387 -maccumulate-outgoing-args
     -malign-stringops -mcx16 -mfancy-math-387 -mfp-ret-in-387 -mfused-madd
     -mglibc -mieee-fp -mmmx -mpush-args -mred-zone -msahf -msse -msse2 -msse3
     -msse4.1 -mssse3 -mtls-direct-seg-refs
    Compiler executable checksum: fc184ee0d48aad037ce15ddb29d848d4
     int main()
    Analyzing compilation unit
    Performing interprocedural optimizations
     <visibility> <early_local_cleanups> <summary generate> <cp> <inline> <static-var> <pure-const>Assembling functions:
     int main()
    Execution times (seconds)
     name lookup           :   0.01 (100%) usr   0.00 ( 0%) sys   0.00 ( 0%) wall     101 kB ( 5%) ggc
     tree gimplify         :   0.00 ( 0%) usr   0.00 ( 0%) sys   0.01 ( 5%) wall       1 kB ( 0%) ggc
     tree CFG construction :   0.00 ( 0%) usr   0.00 ( 0%) sys   0.01 ( 5%) wall       1 kB ( 0%) ggc
     CSE                   :   0.00 ( 0%) usr   0.00 ( 0%) sys   0.02 (10%) wall       0 kB ( 0%) ggc
     CSE 2                 :   0.00 ( 0%) usr   0.01 (100%) sys   0.00 ( 0%) wall       0 kB ( 0%) ggc
     peephole 2            :   0.00 ( 0%) usr   0.00 ( 0%) sys   0.01 ( 5%) wall       0 kB ( 0%) ggc
     scheduling 2          :   0.00 ( 0%) usr   0.00 ( 0%) sys   0.01 ( 5%) wall       1 kB ( 0%) ggc
     TOTAL                 :   0.01             0.01             0.21               1875 kB
    COLLECT_GCC_OPTIONS='-v' '-Q'  '-O3' '-shared-libgcc'
     as -V -Qy -o /tmp/ccpvbszv.o /tmp/cco7J6Lc.s
    GNU assembler version 2.20 (x86_64-linux-gnu) using BFD version (GNU Binutils for Ubuntu) 2.20
    COMPILER_PATH=/usr/lib/gcc/x86_64-linux-gnu/4.4.1/:/usr/lib/gcc/x86_64-linux-gnu/4.4.1/:/usr/lib/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/4.4.1/:/usr/lib/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/4.4.1/:/usr/lib/gcc/x86_64-linux-gnu/
    LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/4.4.1/:/usr/lib/gcc/x86_64-linux-gnu/4.4.1/:/usr/lib/gcc/x86_64-linux-gnu/4.4.1/../../../../lib/:/lib/../lib/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/4.4.1/../../../:/lib/:/usr/lib/:/usr/lib/x86_64-linux-gnu/
    COLLECT_GCC_OPTIONS='-v' '-Q'  '-O3' '-shared-libgcc'
     /usr/lib/gcc/x86_64-linux-gnu/4.4.1/collect2 --build-id --eh-frame-hdr -m elf_x86_64 --hash-style=both -dynamic-linker /lib64/ld-linux-x86-64.so.2 -z relro /usr/lib/gcc/x86_64-linux-gnu/4.4.1/../../../../lib/crt1.o /usr/lib/gcc/x86_64-linux-gnu/4.4.1/../../../../lib/crti.o /usr/lib/gcc/x86_64-linux-gnu/4.4.1/crtbegin.o -L/usr/lib/gcc/x86_64-linux-gnu/4.4.1 -L/usr/lib/gcc/x86_64-linux-gnu/4.4.1 -L/usr/lib/gcc/x86_64-linux-gnu/4.4.1/../../../../lib -L/lib/../lib -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/4.4.1/../../.. -L/usr/lib/x86_64-linux-gnu /tmp/ccpvbszv.o -lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc /usr/lib/gcc/x86_64-linux-gnu/4.4.1/crtend.o /usr/lib/gcc/x86_64-linux-gnu/4.4.1/../../../../lib/crtn.o
    


  • Hmmm.

    Da ich ja nicht für meine Entwicklermaschine optimieren will, sondern eher für den Rest der Welt bzw. ein Minimalsystem ist -march=native nicht so passend, oder?

    Trotzdem vielen Dank
    Sören



  • Also dem gcc sagst du, optimiere mal fuer jede Kruecke. Was sagst du zu Visual Studio? Dann einen Unterschied in der Prozessorauslastung als Benchmark vorzuzeigen, ist nicht ganz ... schlau.



  • Ich vermute, soerenP, das die Ergebnisse von VS noch besser würden, wenn Du nichtmehr den 05er Compiler nutzen würdest, sondern den 10er oder wenigstens den 08er nimmst.

    Der Compiler der Expressversion ist m.E. identisch zu dem der Kauf-Version.

    EDIT: Und Prozessorauslastungen sind wirklich nicht sehr sinnvoll als Performance-Messlatte...



  • soerenP schrieb:

    Das ganze ist ein Audio-Plugin und beim GCC zeigt der Host 33% Auslastung an. Beim VS-Compiler sind es 24%.
    Auf meinem MAC mit 2.53 GHz Intel Core 2 Duo sind das höchstens 5%. (GCC!)( Zum Vergleich: Meine Windows-Maschine hat nen 1.6 GHz Dual Core)

    Was meinst du mit Auslastung? Prozessorauslastung? Das ist wirklich keine gute Vergleichsgröße. Ein hoher Wert kann ja entweder bedeuten, dass das Programm extrem effizient ist und es schafft den Prozessor voll auszulasten oder das es extrem ineffizient ist und daher den Prozessor mehr auslasten muss.

    -mtune=native, wenn du das Resultat auch auf anderen Systemen nutzen willst.

    Siehe http://gcc.gnu.org/onlinedocs/gcc-4.5.0/gcc/i386-and-x86_002d64-Options.html#i386-and-x86_002d64-Options



  • Mr X schrieb:

    Der Compiler der Expressversion ist m.E. identisch zu dem der Kauf-Version.

    Nicht ganz. Profiling zum Beispiel gibts nicht für die Expressversion. Das kann schon deutlich was bringen. Leider finde ich die Produktvergleichsseite nur noch für 2010, nicht für 2008 und 2005.
    Aber irgendwie ist es auch klar dass Microsoft ein bisschen mehr Ahnung von Windows hat als ein paar gcc-Portierer.



  • Meinst Du mit "Profiling" die PGO-Optimierungen (Bringt das viel?)?
    Ansonsten würds ja nur dem Programmierer was bringen...



  • Ich kriegs nicht mehr ganz zusammen, aber es gibt ein Projekt, dass einen Emulator mit Visual Studio geschrieben hat. Alle möglichen Leute wollen mitmachen, laden sich die Quellen runter, aber eine Optimierungsflag gibts nicht in VCExpress. Dann nehmen sie die Option raus und der Emulator ruckelt, was er mit der Option nicht oder deutlich weniger tut.
    Daher meine ich, dass VCProfessional nochmal wesentlich schneller als VCExpress ist. Ich werde mal irgendwie nachfragen, das ist alles zu wage. Ich dachte nur irgendwer listet die Unterschiede auf bevor jemand nachfragt 😉



  • rüdiger schrieb:

    Was meinst du mit Auslastung? Prozessorauslastung? Das ist wirklich keine gute Vergleichsgröße. Ein hoher Wert kann ja entweder bedeuten, dass das Programm extrem effizient ist und es schafft den Prozessor voll auszulasten oder das es extrem ineffizient ist und daher den Prozessor mehr auslasten muss.

    -mtune=native, wenn du das Resultat auch auf anderen Systemen nutzen willst.

    Siehe http://gcc.gnu.org/onlinedocs/gcc-4.5.0/gcc/i386-and-x86_002d64-Options.html#i386-and-x86_002d64-Options

    Das ganze sind Prozessorauslastungen, die mir von der Hostanwendungen für mein Plugin angezeigt werden. Hoch heißt hier schlecht, da die Rechenarbeit pro Zeit fest definiert ist (Echtzeitanwendung!). Wenn ich weniger brauche, habe ich mehr Platz auf dem Prozessor um andere Audio-Plugins laufen zu lassen.
    Es ist die Größe, auf die meine Anwender schauen werden. Die haben keinen Profiler oder sonstiges installiert sondern nur die Anzeige ihres Hosts... (Ein Marketing-Futzie würde sagen: Scheißegal, ob das Ding besser performt, hauptsache, es wird weniger im Host angezeigt 😉 )

    Vielleicht sollte ich mal im CodeAnalyst schauen, woran es bei den verschiedenen Compilern so hapert. Und die 2010er Version ausprobieren.

    Vielen Dank soweit
    Grüße
    Sören



  • rüdiger schrieb:

    btw. für windows gibt es doch gar keinen offiziellen GCC :p

    Doch Out of the Box in der SUA ..

    http://technet.microsoft.com/en-us/library/cc779522(WS.10).aspx
    


  • btw ^^ schrieb:

    rüdiger schrieb:

    btw. für windows gibt es doch gar keinen offiziellen GCC :p

    Doch Out of the Box in der SUA ..

    http://technet.microsoft.com/en-us/library/cc779522(WS.10).aspx
    

    Das ist kein offizieller GCC. Ein offizieller GCC käme vom GNU-Projekt bzw. den GCC Maintainern. Das ist ein GCC-Port von Microsoft. So wie MinGW ein GCC-Port vom MinGW-Projekt ist. Beides ist nicht offiziell. Laut Wikipedia handelt es sich ja sogar nur um einen 3.3er GCC http://en.wikipedia.org/wiki/Microsoft_Windows_Services_for_UNIX (der ist mehr als 7 Jahre alt!)


Anmelden zum Antworten