C-Programm & Cflags

closeDieser Beitrag wurde vor mehr als drei Monaten veröffentlicht. Bedenke bitte, dass die hier angebotene Information nicht mehr aktuell und gültig sein könnte. Informiere dich daher bitte auch an anderer Stelle über dieses Thema. Sollten sich neue Informationen ergeben haben, so kannst du mich auch gerne auf diese über einen Kommentar hinweisen. Vielen Dank!

Ich habe vor einiger Zeit das Prinzip von Makefiles anhand eines kleines Beispiels gezeigt -> http://suckup.de/howto/c/c-programm-primzahlen-makefiles/ <- den selben Quelltext kompilieren wir heute mit verschiedenen C-Flags und 1000000 Schleifendurchläufen …

 

1.)  ohne C-Flags

gcc -lm primzahlen.c -o primzahlen_slow

 

Output: time ./primzahlen_slow

[...]

999961
999979
999983

real 0m1.760s
user 0m1.420s
sys 0m0.164s

 

2.)  ohne C-Flags & ohne “math.h” (sqrt)

gcc primzahlen.c -o primzahlen_slow

 

Output: time ./primzahlen_slow

[...]

999961
999979
999983

real 0m1.407s
user 0m0.988s
sys 0m0.192s

 

3.)  -O2 & ohne “math.h” (sqrt)

gcc -O2 primzahlen.c -o primzahlen_2

 

Output: time ./primzahlen_slow

[...]

999961
999979
999983

real 0m1.405s
user 0m0.976s
sys 0m0.188s

 

4.) -Ofast (http://gcc.gnu.org/gcc-4.6/changes.html) & ohne “math.h” (sqrt)

gcc -Ofast primzahlen.c -o primzahlen_fast

 

Output: time ./primzahlen_fast

[...]

999961
999979
999983

real 0m1.377s
user 0m0.980s
sys 0m0.180s

 

5.) -Ofast + amdfam10 (http://en.gentoo-wiki.com/wiki/Safe_Cflags/AMD#Athlon_X2_7x50.2C_Phenom_X3.2FX4.2C_Phenom_II.2C_Athlon_II_X2.2FX3.2FX4

Ein paar spezielle CFlags für meine CPU. :) (cat /proc/cpuinfo)

gcc -Ofast -funsafe-math-optimizations -funsafe-loop-optimizations -m64 -mtune=amdfam10 -mabm -msse4a -floop-parallelize-all -ftree-parallelize-loops=4 -floop-strip-mine -floop-block -funroll-all-loops -fbranch-target-load-optimize -lm primzahlen.c -o primzahlen_fast

 

Output: time ./primzahlen_fast

[...]

999961
999979
999983

real 0m1.327s
user 0m0.944s
sys 0m0.172s

 

Fazit: 

Sobald ich -O1, -O2, -O3 oder -Ofast bei diesem kleinen Beispiel nutze ist der Geschwindigkeitsunterschied minimal und es ist egal, ob vorgefertigte mathematische Funktionen genutzt werden oder nicht.

1 Star2 Stars3 Stars4 Stars5 Stars (1 votes, average: 4.00 out of 5)
  • David

    Ohne es jetzt ausprobiert zu haben: Geht nicht die meiste Zeit für die Ausgabe mit printf drauf?
    Was passiert, wenn du die raus nimmst und dafür ein paar mehr Primzahlen berechnest? Ist dann das Verhältnis anders?
    So misst du vermutlich eher die Geschwindigkeit vom Terminal (evtl. kannst du als erstes Mal versuchen, die Ausgabe in eine Datei umzuleiten, vielleicht sieht man dann schon, dass die relativen Unterschiede größer werden).

    Ich kann mich natürlich aber auch total irren :-)

  • http://suckup.de Voku
    gcc -Ofast -funsafe-math-optimizations -funsafe-loop-optimizations -m64 -mtune=amdfam10 -mabm -msse4a -floop-parallelize-all -ftree-parallelize-loops=4 -floop-strip-mine -floop-block -funroll-all-loops -fbranch-target-load-optimize -march=amdfam10 -fomit-frame-pointer -minline-stringops-dynamically -mno-align-stringops -fgcse-sm -fgcse-las -fgcse-after-reload -fweb -frename-registers -fsched2-use-superblocks -lm primzahlen.c -o primzahlen_fast

    time ./primzahlen_fast > lall

    real 0m0.937s
    user 0m0.936s
    sys 0m0.004s

    ————————————–

    gcc -O2 primzahlen.c -lm -o primzahlen_slow

    time ./primzahlen_fast > lall

    real 0m0.981s
    user 0m0.972s
    sys 0m0.004s

    ————————————–

    gcc primzahlen.c -lm -o primzahlen_slow

    time ./primzahlen_slow > lall

    real 0m1.424s
    user 0m1.420s
    sys 0m0.004s

    ————————————–

  • http://www.supportnet.de/faqsthread/2407195 Gunter

    der Hinweis mit den Primzahlen hat mir sehr geholfen, Danke