Applikation auf bestimmten CPU-Kern ausführen

FJK

Erfahrenes Mitglied
Hallo,

Ich habe mir ein Programm geschrieben das mir mehre Gleichungen lösen soll. Die Gleichungen sind dabei alle unabhängig voneinander. Nun muss ich mein Programm für jede Gleichung hintereinander ausführen bis alles Berechnet ist. Ich würde jedoch gerne die alle Kerne meiner CPU ausnutzen. Sprich Kern A berechnet Gleichung 1. Kern B Gleichung 2 usw.
Gibt es hier irgend eine Möglichkeit in c++?
Ich weiß das ich in C# bzw.net die Möglichkeit habe, aber wie funktioniert dies ohne .net?
Im Taskmanager kann ich ja auch die Prozesse den Kernen zuweisen.
Ich verwende derzeit ein Windows System 7 und 8.
Außerdem programmiere ich unter Visual Studio 2010.

Unter Linux könnte man ja Forken und unter Windows das äquivalent benutzen, aber das erschafft mir nur einen neuen Prozess.
Ich habe nun dran gedacht ein zweites Programm zu schreiben das mir den Rechenknecht mehrmals startet und auf bestimmte Kerne verlagert.

Funktioniert das?
danke
 
Hi

also mehrere Prozesse sind eine Möglichkeit, aber auch innerhalb von einem Programm geht das. Nur nicht mit dem Taskmanager, Der ist dazu da, die zu verwendenden Kerne zu beschränken (bzw. wieder alle zu erlauben), aber auch das Programm selber muss in der Lage sein, überhaupt mehr als einen Kern zu verwenden.

Bedeutet Anpassungen am Code; die Teile die auf verschiedenen Kernen laufen können müssen klar trennbar sein (auch in C# etc. geht das nicht anders). Das Stichwort hier heißt "Thread". Prinzipiell kann man codemäßige Funktionen parallel starten, vergleichbar mit mehreren Prozessen, nur eben im selben Prozess, und die Threads teilen sich bestimmte programmweite Sachen.

zB. das Konsolenfenster, wenn man eins hat; das bedeutet aber auch dass man bestimmte Vorkehrungen treffen muss, wenn mehrere Threads was ausgeben sollen, dass die sich nicht in die Quere kommen. Oder globale Variablen sind auch geteilt, nur kann es da auch Probleme geben, wenn mehrere Threads gleichzeitig eine Var verwenden. usw.usw.
Ist natürlich alles lösbar, nur muss man das im Kopf behalten.

Wenn die Berechnungen komplett unabhängig sind und es auch sonst kein Problem ist,
mehrere Prozesse zu haben, dann ist das die einfachere Lösung.

Sonst: C++ hat eigentlich alles was man braucht in der Standardlib, plattformunabhängig,,
nur unterstützt das VS2010 nicht so wirklich. Wenn man VS2010 weiterverwenden will
gehts nur mit Windows-spezifischen Funktionen: zB. CreateThread, WaitForMultipleObjects,
CreateMutex für die Synchronisierung usw.usw.
 
Zuletzt bearbeitet:
Hallo

Wenn man VS2010 weiterverwenden will
gehts nur mit Windows-spezifischen Funktionen: zB. CreateThread, WaitForMultipleObjects,
CreateMutex für die Synchronisierung usw.usw.
Unter VS2010 ist das auch eher schwierig, zumal 2010 - C++11.
Hast du einen bestimmten Grund, nicht VS2013 zu verwenden? Die Expressvariante reicht da eigentlich vollkommen aus, dann hast du auch std::async und std::thread.

Dennoch gibt es etwas zu bedenken:
Sprich Kern A berechnet Gleichung 1. Kern B Gleichung 2 usw.
Wie komplex ist die Gleichung denn? Threading lohnt sich vor allem dann, wenn der Overhead des Thread-Erstellens kleiner ist, als die Gleichungen seriell zu lösen. Ein kleines Beispiel:
Die Kreisfläche bei einem bestimmten Radius zu berechnen braucht fast unmerklich Zeit, einen Thread zu erstellen vergleichsweise viel.
Die Kreisfläche von 100'000 zufällig gewählten Radien seriell zu berechnen braucht mehr Zeit, als zwei Threads zu erstellen und je 50'000 zu rechnen.
Ebenso kommt es darauf an, wie viele Kerne du zur Verfügung hast.
Sprich Kern A berechnet Gleichung 1. Kern B Gleichung 2 usw.
Wenn du 2 (logische) Kerne hast und 3 Threads erstellst, bremst du das Ganze wieder aus. Zumindest bei std::async unter VS2013 kann man dieses Verhalten gut sehen.

Mehrere Prozesse dafür zu erstellen halte ich hingegen für keine sehr gute Idee (auch nicht unter Linux), denn so wird es mühsam für jeden, der die Leistung seines Computers manuell an die einzelnen Programme vergeben will.

Bevor du den Code gross abänderst, überlege dir, ob es sich tatsächlich lohnt. Schreibe ggf. einen Benchmark dazu.

Gruss
cwriter
 
Also ich nutze VS2010, da ich finde das sie mit den nachfolgenden Versionen das Layout verhunst haben.

Die Gleichungen sind so komplex das die Berechnung derzeit 2 bis 3 Tage dauert. (Pro Gleichung)

Ich habe ca. 4 Kerne pro PC auf den ich die Berechnung laufen lasse...


Danke Cromon ich werde mir dies morgen mal ansehen

danke
 
Zuletzt bearbeitet:
Worum geht es bei den Berechnungen denn überhaupt?
Vllt. gibts ja eine bessere Lösung...
 
Also ich nutze VS2010, da ich finde das sie mit den nachfolgenden Versionen das Layout verhunst haben.
Steht dir natürlich frei. Allerdings kannst du ja den Grossteil in VS2010 schreiben und dann in VS2013 kompilieren, wenn's dir nur um das Layout geht. Und vielleicht kann man im 2010 auch den Compiler auf 2013 stellen (?). Umgekehrt geht's auf jeden Fall.

Die Gleichungen sind so komplex das die Berechnung derzeit 2 bis 3 Tage dauert. (Pro Gleichung)
Worum geht es bei den Berechnungen denn überhaupt?
Ich schliesse mich mal sheel an. 2 bis 3 Tage auf einem Vierkerner? Pro Gleichung? Das ist tatsächlich ein bisschen viel.

Gruss
cwriter
 
Nein, es geht um Neuronale Netze

und ich nutze derzeit ja nur ein Kern...

Ich unterlasse zur Zeit sogar jegliche Ausgaben, also Statusmeldungen wie weit er ist mit "cout", da dies zu viel Zeit frisst.
Gibt es da irgendwelche Tricks? Andere Simulatoren schaffen es doch auch live Graphen oder Ausgaben zu erzeugen und ich bezweifle das die das auf (große) Kosten von Rechenzeit machen...
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück