Hallo Forum.
Ich habe ein Minimalbeispiel generiert. Es geht um die Anwendung von parfor und mehreren Sachen, die ich in der Schleife ausrechnen lassen will. Beide Funktionen sind unabhängig voneinander. Aber ich bekomme eine Fehlermeldung:
Error using parfor_test_version1 (line 21)
Error: The variable empty_vector1 in a parfor cannot be classified.
See Parallel for Loops in MATLAB, "Overview".
Die Toolbox ist vorhanden.
Das Beispiel sieht wie folgt aus:
Code:
%copied to start the workers
pools = matlabpool('size');
cpus = feature('numCores');
if pools ~= (cpus - 1) if pools > 0
matlabpool('close');
end
matlabpool('open', cpus - 1);
end
Ich verstehe momentan nicht das Problem von Matlab. Läuft die parfor-Schleife nicht von m=1: end durch und verteilt die Arbeit?
Außerdem wird für jedes m,tt Paar ein eigenständiger Wert ausgerechnet und in die Matrix geschrieben. Ich denke wohl falsch, aber die Positionen sind doch eindeutig für jedes m und jedes tt.
Danke für Euer Feedback.
das liegt in besonderen Anforderungen von parfor-Schleifen, da der Code ja in einem anderen Prozess, möglicherweise sogar auf einem anderen Rechner lauffähig sein muss.
Folgendes läuft bei mir:
Code:
%copied to start the workers
pools = matlabpool('size');
cpus = feature('numCores');
if pools ~= (cpus - 1) if pools > 0
matlabpool('close');
end
matlabpool('open', cpus - 1);
end
Hallo Harald,
erstmal danke für die schnelle Rückmeldung.
Ja, es läuft auch ohne Probleme auf meinem Rechner.
Ich verstehe nur nicht warum. Ich versuche gleich deinen Code zu verstehen.
Re Anzahl der Rechner:
Mir wurde erzählt, dass Matlab eher auf verschiedenen Kernen rechnet als verschiedenen Rechnern.
Re Dein Beispiel:
Ich hatte ähnliche Beispiele gesehen. Der Trick scheint wohl erst zu sein, dass man die Funktionen erst in einer Dimension ausrechnen läßt und sie später wieder in die Matrix zurückschreibt.
Man "teilt" die innere For-Schleife auf.
Kannst du vielleicht auch erklären, warum das so sein muss?
Vielen Dank.
Edit: Könntest du mir bitte auch numel erklären? Warum ist das besser als size?
Edit2: Bringt das überhaupt was?
Wenn man in meinem Beispiel oben das parfor mit for ersetzt und zeitlich mit deiner Version vergleicht, bekomme ich:
Elapsed time is 0.029954 seconds.
Elapsed time is 0.253073 seconds.
Mein eigentliches,richtiges Beispiel dauert in einer Version ähnlich zu ganz oben ca. 1400s. Laufe ich Gefahr, dass es mit parfor noch länger dauert?
Mir wurde erzählt, dass Matlab eher auf verschiedenen Kernen rechnet als verschiedenen Rechnern.
Das wird durch das Profil gesteuert, mit dem der MATLAB Pool geöffnet wird. Default ist mehrere Kerne eines Rechners. parfor ist aber so gedacht, dass eine Ausführung auf mehreren Rechnern möglich ist (auch wenn du das vielleicht nicht nutzt).
Zitat:
Kannst du vielleicht auch erklären, warum das so sein muss?
So tief sind meine Kenntnisse da auch nicht. Die Fehlermeldung besagte ja, dass etwas nicht aufgelöst werden kann. Durch diese Modifikation kann es eben aufgelöst werden.
Zitat:
Könntest du mir bitte auch numel erklären? Warum ist das besser als size?
numel liefert Gesamtanzahl der Elemente, size die Dimensionen. Es ist nicht so, dass das eine besser ist als das andere - die Frage ist einfach, welche Information man gerade braucht.
Zitat:
Wenn man in meinem Beispiel oben das parfor mit for ersetzt und zeitlich mit deiner Version vergleicht, bekomme ich:
Die Laufzeit ist einfach zu kurz. Du solltest etwas wählen, das min. 10 Sekunden braucht, damit der Overhead durch das Parallelisieren nicht mehr relevant ist.
Hallo Harald,
danke für deine Geduld und deine guten Erklärungen.
Du hast recht, ich kann wohl nur local ein Profil mit 12Kernen hier haben.
Ich habe mit 12Kernen rechnen lassen und ein Run dauerte ca. eine halbe Stunde. Davor hatte ich 14h. Zusätzlich habe ich vielleicht auch noch Zeit gespart, indem ich quad durch quadgk ausgetauscht habe.
Re numel.
Wenn ich jetzt einen Vektor mit 1x200 Einträgen habe, dann gibt mir size doch 1, 200 zurück. Damit weiss ich doch auch, wieviele Einträge (Elemente?) mein Vektor hat. Aber vielleicht missbrauche ich hier den size-Befehl einfach?
Wenn ich jetzt einen Vektor mit 1x200 Einträgen habe, dann gibt mir size doch 1, 200 zurück. Damit weiss ich doch auch, wieviele Einträge (Elemente?) mein Vektor hat.
Das weißt du dann auch. Wenn dich aber nur diese Info interessiert, bist du mit numel besser beraten.
Zitat:
Ich habe mit 12Kernen rechnen lassen und ein Run dauerte ca. eine halbe Stunde. Davor hatte ich 14h.
Also Faktor 28? Da muss schon auch quadgk deutlich geholfen haben. Man müsste wohl gleiches mit gleichem vergleichen, um tatsächlich den Speedup durch die Parallelisierung zu sehen. Bei 12 Kernen würde ich auf Faktor 6-10 hoffen - 12 wäre schon sehr ideal. Man hat ja schließlich nicht 12fachen Hauptspeicher, Cache, etc.
Falls du eine aktuelle MATLAB-Version hast, kannst du auch integral statt quad oder quadgk versuchen.
Mit R2014a fällt übrigens die Beschränkung auf 12 Worker bei lokalen Profilen weg. Wenn deine Maschine also mehr Kerne hat, kannst du diese auf die Weise ausnutzen.
Also Faktor 28? Da muss schon auch quadgk deutlich geholfen haben. Man müsste wohl gleiches mit gleichem vergleichen, um tatsächlich den Speedup durch die Parallelisierung zu sehen. Bei 12 Kernen würde ich auf Faktor 6-10 hoffen - 12 wäre schon sehr ideal. Man hat ja schließlich nicht 12fachen Hauptspeicher, Cache, etc.
Du hast recht, ich hätte gleiches mit gleichem vergleichen sollen. Die 14h waren auch auf einem anderen Rechner. Tut mir leid. Der Vergleich hinkt. Ich bin aber schon froh, dass es jetzt nur 30min dauert.
Re numel: Daran werde ich denken.
Viele Grüße.
blue
ist ja kein Problem :) Über "schneller als erwartet" beschwert man sich ja normalerweise nicht :D Das wäre jetzt eher persönliche Neugierde.
Grüße,
Harald
Einstellungen und Berechtigungen
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.