Wie kann man Dual Core Prozessoren mit C++ nutzen?
-
Hallo liebe C++ Gemeinde,
ich habe da eine Frage an Euch.
Ich habe ein Programm geschrieben, welches viel Rechenzeit beansprucht.Der Rechner auf dem ich dieses laufen lasse ist ein DualCore.
Ihr werdet meine Frage schon erahnen.Auf welche Art und Weise müsste ich das Programm umschreiben, um Parallelrechnen zu ermöglichen?
Ich kenne mich mit der Methodik der Mehrkernprozessoren nicht aus, und deshalb diese offene Frage.Kann ich zum beispiel die DualCores in einem Programm nutzen, oder bringen die nur was, wenn zwei Prozesse (Programme) laufen? (->dann müsste ich ja das, was gerechnet wird auf zwei Programme verteilen).
Also, ich hoffe, dass sich jemand von Euch da auskennt, und mir ein Paar Tips geben kann.
Gruss,
urrghs
-
Ist glaub' ich eher eine Frage des Betriebssystems. Eigentlich sollte das herausfinden, welcher Code nicht voneinander abhängt und somit auf unterschiedlichen cores laufen kann. Hat dein Programm zwei Threads und läuft auf einem DualCore würd' ich darauf Tippen, dass jeder Thread (für seinen slice) jeweils einen Kern bekommt - theoretisch.
Aber hoffentlich sagt noch wer etwas genaueres dazu

greetz, Swordfish
-
Wenn du 2 Cores ausnutzen willst, musst du 2 oder mehr Threads gleichzeitig laufen haben. Dazu gibts mehrere Möglichkeiten:
Du hast 2 oder mehr Programme (Prozesse) gleichzeitig laufen.
Du startest in deinem Programm mehrere Threads. Dazu brauchst du eine Threading Library, ggf. direkt die Funktionen des Betriebssystems, oder aber eine Library die das kapselt.
Du verwendest eine C++ Implementierung die OpenMP unterstützt (z.B. MSVC 8), und verwendest dann die diversen OpenMP Konstrukte um z.B. Schleifen zu parallelisieren.
Sonstige C++ Erweiterungen. Ich kenne da bloss Cilk, ist aber eine ANSI-C Erweiterung, also nix mit C++.Mit "Standard C++ und sonst nix" kannst du IMHO nur die erste Möglichkeit nutzen. (Genaugenommen nichtmal das, da du ja das Betriebsystem brauchst um die Prozesse zu starten)
Eigentlich sollte das (Betriebssystem) herausfinden, welcher Code nicht voneinander abhängt und somit auf unterschiedlichen cores laufen kann.
Wie sollte es denn das machen? Moderne CPUs parallelisieren ja schon einiges auf einem einzigen Core. Viel mehr als die schon selbst machen geht da nicht, da Maschinencode eben nicht wirklich gut geeignet ist um Programme auf Parallelisierbarkeit zu analysieren. Viel besser könnte das der Compiler bzw. Code Generator erledigen, bloss ist da C++ leider auch nicht wirklich gut geeignet. Referenzen, Zeiger, globale Variablen - stört alles ungemein. Mit einer funktionalen Sprache hat man da wesentlich mehr Chancen, oder eben mit etwas wie Cilk.
-
Jo, OpenMP dürfte bei dir die erste Wahl sein.
Damit kann man mit dem geringsten Aufwand die parallele Funktionalität verwenden.
Einen Schritt weiter gehen Konzepte, die auf verteiltem Speicher beruhen, wie z.B. der Klassiker MPI (z.B. Implementierung MPICH).
Sind aber wesentlich aufwändiger und unschöner in der Handhabung, zumal sich Einsteiger sich sehr schnell sogenannene Deadlocks einhandeln, die man schwer debuggen kann. Apropro Debugger. VS 8 ist kompatibel zu MPICH und hat sogar ein MPI-Debugger Profil, mit dem man das Programm einigermaßen debuggen kann.
Aber wie gesagt, letzteres ist eher für PC-Cluster oder Hochleistungsrechner gedacht.
Ach ja, mehere Threads kann man auf verwenden. Wobei man da meist nicht soviel Einfluss darauf hat auf welchem Kern der nächste gestartet wird, das übernimmt in der Regel das Betriebssystem. Dies macht aber ähnlich wie bei MPI nur Sinn, wenn du tatsächlich zu trennende Aufgaben hast (GUI <-> Rechenkern).
-
OMG! Dann sollt ich mich schleunigst mit Parallelisierung beschäftigen

greetz, Swordfish