Visual C++, auf mehreren Kernen kompilieren



  • Ich kompiliere mein Projekt auf Linux in ca. 50 Sekunden auf einem AMD64 3200. Nun habe ich mir einen i7 gegönnt, mit dem das Programmieren wieder mehr Spaß macht: unter 5 Sekunden bin ich startklar. 🙂

    Ähnlich begeisternd habe ich mir das mit Visual C++ vorgestellt. Hier kam ich von 70 Sekunden runter auf 56 Sekunden. Hier hatte ich mir doch mehr versprochen. ^^

    Was nutzt mir ein 8-Zylinder, wenn mich Visual C++ auf an einen Rasenmäher kettet?
    Wo biege ich Visual C++ bei, alle Kerne zu nutzen?

    Vielen Dank!



  • Welche Version von VS hast Du denn? Ab VS2010 ist dies per default aktiviert. In VS2008 kann man es über eine switch aktivieren...



  • In VS2008 ist der Compiler-Switch /MP:
    http://msdn.microsoft.com/en-us/library/bb385193(VS.90).aspx

    Ansonsten kannst Du Dir auch mal IncrediBuild anschauen:
    http://www.xoreax.com/visual_studio.htm



  • Jochen Kalmbach schrieb:

    Welche Version von VS hast Du denn? Ab VS2010 ist dies per default aktiviert. In VS2008 kann man es über eine switch aktivieren...

    2010 Express.
    Ist die Express diesbezüglich vielleicht eingeschränkt?

    Danke erstmal für die Tipps, ich schaue gleich mal nach, wo ich den /MP-Switch finde. Ich habe hier gerade bei Visual Studio 2005 (kein Express) nachgeguckt und ihn nicht gefunden. Ihn zusätzlich in die Befehlszeile einzugeben, hat Visual Studio (2005) nicht wirklich beeindruckt.



  • Das geht erst ab VS2008. Ob die Express hier eine Einschränkung hat, kann ich Dir so auf die schnelle nicht sagen. Wie sieht denn Deine Build-Ausgabe aus?
    Normal muss eine Zahl (1-x) davor stehen... dann siehst Du, dass es auf mehrere Kerne verteilt wurde... also z.B.

    1> a.cpp
    2> b.cpp
    3> c.cpp
    4> d.cpp
    ...
    1> e.cpp
    ...



  • @Jochen Kalmbach:
    /MP geht ab Studio 2005. Muss man zwar mit Hand in die Additional Options schreiben, aber geht.

    Bei einem /MP Build steht bei mir auch keine Zahl davor.

    Das ">Zahl" sehe ich nur, wenn ich über Build Solution baue, und die (ziemlich wertlose) "Options/Projects and Solutions/Build and Run/maximal number of parallel builds" Einstellung greift. (Ziemlich wertlos da sie nur unterschiedliche *Projekte* gleichzeitig bauen kann, und das auch nur wenn man NICHT Batch-Build verwendet... hmpf.)

    Am besten einfach Build-Zeiten und CPU Auslastung beobachten wenn man wissen will ob's greift. Bzw. im Task-Manager nachgucken wie viele cl.exe Instanzen gleichzeitig laufen.
    (Bei der /MP Option sollte eine Instanz immer laufen, und sobald parallel compiliert werden kann, also z.B. wenn er mit stdafx.cpp fertig ist, zusätzlich eine pro Kern.)



  • Jochen Kalmbach schrieb:

    Das geht erst ab VS2008. Ob die Express hier eine Einschränkung hat, kann ich Dir so auf die schnelle nicht sagen. Wie sieht denn Deine Build-Ausgabe aus?

    Ich habe es jetzt mit dem Hinweis auf /MP ans laufen bekommen. Wo man den Schalter in Visual C++ 2010 Express nun in den Einstellungen umstellt habe nicht gefunden, also einfach in die Befehlszeile mit /MP8 dazugeschrieben.

    Zunächst beschwerte er sich, dass sich /MP mit /Gm beißt, nachdem ich das abgeschaltet habe, funktioniert es deutlich schneller und es wurde auch gleich mit 8 Tasks gestartet.
    Die Ausgabe sieht wie folgt aus:

    1>------ Neues Erstellen gestartet: Projekt: genesys, Konfiguration: Debug Win32 ------
    1>  area.cpp
    1>  file.cpp
    1>  fileposition.cpp
    1>  segment.cpp
    1>  stack.cpp
    1>  table.cpp
    1>  lineendencoding.cpp
    1>  path.cpp
    1>  representation.cpp
    
    ....vieles weitere...
    

    Jochen Kalmbach schrieb:

    Normal muss eine Zahl (1-x) davor stehen... dann siehst Du, dass es auf mehrere Kerne verteilt wurde...

    Kann ich - wie Du siehst - nicht nachvollziehen. Der Build mit VS2010 oben hat 10 Sekunden gedauert. Das ist bedauerlicherweise doppelt so lange wie unter Linux mit make (GCC 4). CodeLite mit minGW (GCC 3) braucht ca. 8 Sekunden.

    "time make -j 8" unter Cygwin/Windows mit GCC 3 gibt fast 12 Sekunden an. Offenbar ist beim GCC4 einiges unter der Haube optimiert worden.

    Wie auch immer... 10 Sekunden ist im Vergleich zu 70 Sekunden auf dem AMD ein akzeptabler Fortschritt für ein Rebuild.

    Ich danke euch für eure Hilfe. 🙂



  • @Xin:
    /MP8 sollte nicht nötig sein (=nur /MP sollte reichen). Default ist Anzahl der virtuellen CPUs, also eh 8 bei einem 4-kernigen i7 (4 Kerne * 2 HT-Units pro Kern = 8 virtuelle CPUs).

    Vorteil wenn man's weglässt: bei mehr/weniger Kernen wird automatisch die "richtige" Anzahl Compiler-Instanzen verwendet. Und die "falsche" Anzahl - zu wenige, aber auch zu viele - würde bremsen.

    EDIT: und siehe mein Beitrag weiter oben: die "1>" geben nur die Nummer des Projekts an, wenn du eingestellt hast dass mehrere Projekte gleichzeitig gebaut werden sollen. Da du nur ein Projekt baust, ist es bei dir immer 1.


Anmelden zum Antworten