Wow, danke für die vielen Hinweise.
Euklid hat geschrieben:Du kannst Dir also eine separate CopyVector-Routine ersparen
Ja, klar, grundsätzlich Du hast natürlich recht. Aber wenn ich mich recht erinnere stellt Copy auch den Speicherbereich zur Verfügung, und das kann ich nicht brauchen, denn ich kopiere häufig von einem gültigen Vektor in einen anderen gültigen Vektor. Ich müßte mir die Copy-Routine erst ansehen, ob sie das auch berücksichtigt.
mschnell hat geschrieben:Ich habe vor einiger Zeit eine paar Unterprogramme zur Matrizenrechnung gemacht, u.a. a auch Lösen eines lineare Gleichungssystems (auch mehrerer parallelr z.B. zur Matrix-invertierung)
Ist nicht extrem Performance-optimiert, funktioniert aber gut und ist Dank permanenter Pivot-Optimierung sehr stabil. Kannst Du Dir gern anschauen. (Bei der Pivot-Optimierung brauchen bei dynamischen Arrays keine Zeilen kopiert zu werden !)
Super! Ich mache grade etwas Ähnliches, folgende Lineare Solver habe ich in den letzten Monaten implementiert:
[pascal]
TGaussJordanSolver = Class(TSparseSolver);
TGaussSeidelSolver = Class(TIterativeSolver); // der ODE-Solver
TConjGradSolver = Class(TIterativeSolver); // Methode der konjugierten Gradienten
TBiCGStabSolver = Class(TIterativeSolver)
[/pascal]
Das war nicht einfach, und den BiCGStabSolver habe ich gerade vor einer Stunde zum Laufen gebracht. Das feiere ich gerade. *Luftsprung mach*
Die Dinger sind alle (bis auf den ersten) für das Lösen von großen, dünnbesetzten Matrizen gedacht. Lt. Googlecode-Suche gibt es so etwas im Internet für C/C++, Fortran, Matlab, aber nicht für Pascal. Ich hätte auch gar nichts dagegen, die Dinger herzuzeigen bzw. Open Source zu machen, wenn sie dann fertig sind.
Ich hatte nie angenommen, dass ich das überhaupt schaffe. Wenn ich ganz ehrlich bin, muss ich zugeben, dass mir irgendwo ab der Methode der konjugierten Gradienten die Theorie ziemlich schleierhaft wird. Aber nachdem ich das wieder Erwarten geschafft hatte, hat mich der Größenwahn gepackt.
lrlr hat geschrieben:>Zur Performance Optimierung würde ich vorschlagen, je nach Anzahl der Prozessoren des Rechners mehrere Threads für Aktionen anzuwerfen,
oder CUDA usw. (GPU rechnen lassen)...
ber da gibts wohl nix in pascal..
Tja, das mit den Threads sollte man machen, ja. Die C-Open-Source-Implementierungen machen das angeblich. Ich muss mir aber erstmal ansehen, ob das bei diesen Methoden überhaupt geht. Wenn sich eine Iteration aus der vorherigen berechnet geht es halt eben nicht. Und bei Threads bin ich ein Neuling.
Wenn man die GPU ansprechen will, muss man soweit ich weiß Shader verwenden (auch da bin ich ein Neuling, aber Shader sind ein Fixpunkt in meinem Programm für dieses Jahr). Aber in meinem Fall geht das Rechnen per GPU nicht, denn die Solver sind u.a. für eine Physik-Engine gedacht, und während die CPU Physikberechnungen anstellt soll die Grafikkarte zeichnen was das Zeug hergibt.
Viele Grüße
Traude