Multithreading für iterativen Algorithmus
-
Hallo,
ich habe mich bisher nie mit Multithreading beschäftigt und hätte dazu mal eine Frage:
Wenn ich meine Single threaded application starte und eine cpu-lastige Berechnung durchführe, dann wird aufgrund des Single Threadings nur ein Kern bzw. eine virtuelle CPU genutzt. So auch bei meinem 3.6ghz Intel mit Hyperthreading.
Nun würde ich gerne Multithreading nutzen, um alle Kerne/Cpu's mit einzubeziehen.
Mein Problem besteht jetzt darin, ob es möglich ist, eine for-schleife, die nur in genau einer reihenfolge abgearbeitet werden kann, irgendwie auf mehrere Threads aufzuteilen ?Schonmal Danke für eure Hilfe,
-tdl
-
tdl schrieb:
Mein Problem besteht jetzt darin, ob es möglich ist, eine for-schleife, die nur in genau einer reihenfolge abgearbeitet werden kann, irgendwie auf mehrere Threads aufzuteilen ?
Nein, das geht nicht.
Aber meistens muß sie nicht wirklich in genau einer Reihenfolge ausgewertet werden, weil man zum Beispiel die Ergebnisse aus den Threads wieder sammeln kann und dem Empfänger wieder in der richtigen Reihenfolge präsentieren oder weil man riskieren kann, Nutzlose Berechnungen zu machen, die man, wenn das Ergebnis im ersten Block war, halt wegwerfen muß.
-
Danke für deine Antwort,
Es muss leider wirklich diese Reihenfolge sein, da es sich um eine Fehler Rückpropagierung in einem künstlichen neuronalen Netz handelt. Es müssen dann in jedem Schritt viele Member Variablen und Objekte der Klasse geändert werden und abhängig davon sind dann die Berechnungen der nächsten Iteration.
Aber wenn das wirklich nicht geht, finde ich dieses Multi Cpu Design irgendwie sinnlos. Die meisten Prozesse, die heute im Einsatz sind, sind ja wohl doch eher Single threaded (video kompression, compilieren, linken, ...).
Und sonst siehst du keine Möglichkeit, die gesamte Cpu irgendwie zu nutzen ?
-
tdl schrieb:
Danke für deine Antwort,
Es muss leider wirklich diese Reihenfolge sein, da es sich um eine Fehler Rückpropagierung in einem künstlichen neuronalen Netz handelt. Es müssen dann in jedem Schritt viele Member Variablen und Objekte der Klasse geändert werden und abhängig davon sind dann die Berechnungen der nächsten Iteration.Ja, das ist schade.
Aber wenn das wirklich nicht geht, finde ich dieses Multi Cpu Design irgendwie sinnlos.
Schneller kriegen sie es halt nicht hin, aber mehr gleichzeitig können sie.
Die meisten Prozesse, die heute im Einsatz sind, sind ja wohl doch eher Single threaded (video kompression, compilieren, linken, ...).
Compilieren macht mein make aber parallel. Pro *.cpp ein Prozess. Es muß ja nicht immer in inneren Schleifen parallelisiert werden.
Und sonst siehst du keine Möglichkeit, die gesamte Cpu irgendwie zu nutzen ?
Nee, nicht im Netz. Aber ich habe von den neuronalen Netzen zu wenig Ahnung um da sicher zu sein. Da kann ich Dir nur eine äußere Schleife wünschen, die parallelisierbar ist.

-
Danke, dann werde ich wohl innerhalb der Rückpropagierung MT einbauen müssen, indem ich das Netz z.b. in verschiedene Teile splitte.
Wenn keiner mehr eine Erleuchtung hat, dann bin ich auch so zufrieden.
Gruß
-m
-
Die meisten Prozesse, die heute im Einsatz sind, sind ja wohl doch eher Single threaded (video kompression, compilieren, linken, ...).
Falsch
-
Naja Compile und Link sind singlethreaded, selbst VC-2010 macht da soviel Unterschied nicht... Man merkt die Performance aber dennoch, da ein Prozessor sich um den I/O kümmert und der andere die reine CPU Arbeit erledigt...
-
Meist hat man halt mehr als ein Frame Video zu bearbeiten, und mehr als ein Source-File zu compilieren...
Ging mir aber eher um die Aussage "die Meisten Prozesse, die heute im Einsatz sind". Nur weil klein Erna sich nicht vorstellen kann, wo man Multi-Threading überall sinnvoll einsetzen kann, heisst das nicht, dass es die grossen Jungs nicht trotzdem können.
-
hustbaer schrieb:
Nur weil klein Erna sich nicht vorstellen kann, wo man Multi-Threading überall sinnvoll einsetzen kann, heisst das nicht, dass es die grossen Jungs nicht trotzdem können.

-
.
-
Es muss leider wirklich diese Reihenfolge sein, da es sich um eine Fehler Rückpropagierung in einem künstlichen neuronalen Netz handelt.
Vielleicht mal die Matrixvariante von feed forward back propagation Netze angeschaut. Das sollte parallelisierbar sein im Sinne der Matrixmultiplikation. Einzelne Neuronen in einer Schicht sind unabhaengig von anderen der gleichen Schicht.